RecursionError с исполнителем пула потоков на render.com (решено, но есть дополнительный вопрос)

Я хочу использовать исполнителя пула потоков для одновременного получения котировок в приложении фляги. Основной причиной использования пула потоков является ускорение, так как количество кавычек составляет 10~30. Я использую веб-сервер render. Однако я продолжаю получать эту ошибку рекурсии:RecursionError: maximum recursion depth exceeded while calling a Python object

Вот часть кода, которая имеет отношение:

      from bs4 import BeautifulSoup
import requests
from gevent.threadpool import ThreadPoolExecutor


def get_yahoo_price(code):
    response = requests.get("https://tw.stock.yahoo.com/quote/" + code)
    soup = BeautifulSoup(response.text, "lxml")
    price = soup.find('span', class_ = "Fz(32px)").getText()
    return float(price)

## the part in my flsak app that used threadpoolexecutor
with ThreadPoolExecutor(max_workers=10) as executor:
    result = executor.map(get_yahoo_price, codes)

Файл:

      web: gunicorn app:app

Команда запуска

      gunicorn app:app --workers 3 --worker-class gevent --timeout 60

В документе Render говорится, что приложение будет использовать общий процессор на бесплатном плане. Я не уверен, повлияет ли это на правильный способ реализации многопоточной программы в Интернете. Как его настроить, чтобы он работал?

Редактировать:

Я наткнулся на этот пост и решил свою проблему. Мое решение выглядит следующим образом:

  • отfrom gevent.threadpool import ThreadPoolExecutorкfrom concurrent.futures import ThreadPoolExecutor

  • добавить в мой корневой каталог

      # config.py

import gevent.monkey
gevent.monkey.patch_all()

workers = 5
  • изменил мою команду запуска наgunicorn --config config.py --worker-class gevent --preload --timeout 60 app:app

Но все равно как-то медленно. Этот процесс занял около 20 секунд на сервере, тогда как мой ноутбук занял всего 3 секунды.

Мой следующий вопрос: можно ли что-то улучшить? Я уже пробовал менять воркеров вconfig.py, илиmax_workersвThreadPoolExecutor, но он выполняет то же самое.

0 ответов

Другие вопросы по тегам