Python请求非阻塞?

Python Requests non-blocking?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Asynchronous Requests with Python requests

python模块请求是非阻塞的吗? 我没有在文档中看到有关阻止或非阻塞的任何内容。

如果它是阻塞的,你会建议哪个模块?


urllib2一样,requests是阻塞的。

但我也不建议使用另一个库。

最简单的答案是在单独的线程中运行每个请求。除非你有数百个,否则这应该没问题。 (多少数百个太多取决于您的平台。在Windows上,限制可能是您拥有的线程堆栈内存;在大多数其他平台上,截止时间更早。)

如果你有数百个,你可以将它们放在一个线程池中。 concurrent.futures页面中的ThreadPoolExecutor示例几乎就是您所需要的;只需将urllib调用更改为requests调用即可。 (如果你使用的是2.x,请使用futures,PyPI上相同软件包的后端。)缺点是你实际上并没有立即启动所有1000个请求,只是第一个,比如8。

如果你有数百个,并且它们都需要并行,这听起来像gevent的工作。让它monkeypatch一切,然后编写你用线程写的完全相同的代码,但产生greenlet而不是Thread s。

grequests,直接在requests中从旧的异步支持发展而来,有效地为您执行gevent + requests包装。对于最简单的情况,它很棒。但是对于任何非平凡的事情,我发现读取显式gevent代码更容易。你的旅费可能会改变。

当然,如果你需要做一些非常有趣的事情,你可能想要去twistedtornadotulip(或等待几个月,tulip成为stdlib的一部分)。


它是阻塞的,但这让我想起了一个整洁的小包装,我知道我把它放在gevent周围,它回到了eventlet,然后如果这两个都不存在则会线程化。您可以将函数添加到类似于dicts或列表的数据结构中,只要添加了函数,它们就会在后台执行,并且只要函数执行完毕,就可以使用函数返回的值代替函数。它在这里。