Celery + Eventlet + non blocking requests

前端 未结 2 1132
遇见更好的自我
遇见更好的自我 2020-12-09 20:23

I am using Python requests in celery workers to make large number of (~10/sec) API calls(includes GET,POST, PUT, DELETE). Each request takes around

相关标签:
2条回答
  • 2020-12-09 20:32

    Use eventlet monkey patching to make any pure python library non-blocking.

    • patch single library

      # import requests  # instead do this:
      import eventlet
      requests = eventlet.import_patched('requests')
      

      packages erequests and grequests could be stripped down to these two lines.

    • patch everything

      import eventlet
      eventlet.monkey_patch()  # must execute as early as possible
      ...
      # everything is non-blocking now:
      import requests, amqp, memcache, paramiko, redis
      

    Update: there is known issue with monkey patching requests library. If you get:

    ImportError: cannot import name utils
    

    , then modify import line to

    requests = eventlet.import_patched('requests.__init__')
    
    0 讨论(0)
  • 2020-12-09 20:51

    from the docs:

    there are lots of projects out there that combine Requests with one of Python’s asynchronicity frameworks. Two excellent examples are grequests and requests-futures.

    for eventlet specifically you can use erequests.

    0 讨论(0)
提交回复
热议问题