Python请求非阻塞?

时间:2013-01-09 20:36:06

标签: python python-requests

  

可能重复:
  Asynchronous Requests with Python requests

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

如果阻止,你会建议哪个模块?

2 个答案:

答案 0 :(得分:39)

urllib2一样,requests正在阻止。

但我也不建议使用其他库。

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

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

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

grequests,直接来自requests中的旧异步支持,有效地为您执行gevent + requests包装。对于最简单的情况,它很棒。但是对于任何非平凡的事情,我发现阅读显式gevent代码更容易。您的里程可能会有所不同。

当然,如果您需要做一些真的花哨的事情,您可能想要转到twistedtornadotulip(或等待一些tulip成为stdlib一部分的月份。

答案 1 :(得分:0)

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