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
, но он выполняет то же самое.