Celery + Eventlet + без блокировки запросов

Я использую requests Python у workers сельдерея, чтобы сделать большое количество (~ 10 / сек) вызовов API (включая GET, POST, PUT, DELETE). Каждый запрос занимает около 5-10 секунд.

Я попробовал работать с eventlet в eventlet пула, с 1000 параллелизмом.

Поскольку requests блокируют процесс, каждое параллельное соединение ожидает по одному запросу.

Как сделать requests асинхронными?

2 Solutions collect form web for “Celery + Eventlet + без блокировки запросов”

Используйте патч обезьяны eventlet [1], чтобы сделать любую чистую библиотеку python неблокирующей.

  • patch single library # import requests # instead do this: import eventlet requests = eventlet.import_patched('requests') пакеты erequests и grequests могут быть разделены до этих двух строк.
  • patch import eventlet eventlet.monkey_patch() # must execute as early as possible ... import requests, amqp, memcache, paramiko, redis # everything is non-blocking now

[1] http://eventlet.net/doc/patching.html

Обновление: существует известная проблема [2] с библиотекой запросов исправления обезьяны. Если вы ImportError: cannot import name utils , затем измените строку импорта на requests = eventlet.import_patched('requests.__init__') [2] https://github.com/eventlet/eventlet/issues/7

из документов :

есть много проектов, которые объединяют Запросы с одной из асинхронных возможностей Python. Два отличных примера – это графики и запросы-фьючерсы.

для eventlet специально вы можете использовать erequests .

Python - лучший язык программирования в мире.