答案 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
代码更容易。您的里程可能会有所不同。
当然,如果您需要做一些真的花哨的事情,您可能想要转到twisted
,tornado
或tulip
(或等待一些tulip
成为stdlib一部分的月份。
答案 1 :(得分:0)
它是阻塞的,但是这让我想起了一个我知道围绕gevent的一个整洁的小包装器,它回到了eventlet,然后如果这两个都不存在则会线程化。您可以将函数添加到类似于dicts或列表的数据结构中,只要添加了函数,它们就会在后台执行,并且只要函数执行完毕,就可以使用函数返回的值代替函数。这是here。