10

requests在 celeryworkers中使用 Python 进行大量(~10/秒)API 调用(包括 GET、POST、PUT、DELETE)。每个请求大约需要 5-10 秒才能完成。

我尝试在池中运行 celery workers,eventlet并发 1000。

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

如何使requests异步?

4

2 回答 2

17

使用 eventlet猴子补丁来使任何纯 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
    

更新:猴子修补请求库存在已知问题。如果你得到:

ImportError: cannot import name utils

,然后将导入行修改为

requests = eventlet.import_patched('requests.__init__')
于 2015-02-04T22:31:09.190 回答
2

来自文档

有很多项目将请求与 Python 的异步框架之一结合起来。两个很好的例子是 grequestsrequests-futures。

对于 eventlet,您可以使用erequests

于 2015-02-04T07:26:26.683 回答