Celery + Eventlet +非阻塞请求

时间:2015-02-04 07:20:50

标签: python celery python-requests eventlet grequests

我在celery requests中使用Python workers来进行大量(~10 / sec)API调用(包括GET,POST,PUT,DELETE)。每个请求大约需要5到10秒才能完成。

我尝试在eventlet池中运行芹菜工作者,并发1000次。

由于requests是阻塞进程,因此每个并发连接都在等待一个请求。

如何使requests异步?

2 个答案:

答案 0 :(得分:14)

使用eventlet monkey patching使任何纯python库无阻塞。

  • 补丁单库

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

    包裹erequestsgrequests可以拆分为这两行。

  • 修补所有内容

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

更新known issue有猴子修补请求库。如果你得到:

ImportError: cannot import name utils

,然后将导入行修改为

requests = eventlet.import_patched('requests.__init__')

答案 1 :(得分:2)

来自docs

  

有许多项目将请求与其中一项相结合   Python的异步框架。两个很好的例子是   grequestsrequests-futures.

对于eventlet,您可以使用erequests