可能重复:
带有 Python 请求的异步请求
python模块请求是非阻塞的吗?我在文档中没有看到任何关于阻塞或非阻塞的内容。
如果它被阻塞,你会建议哪个模块?
像urllib2
,requests
正在阻塞。
但我也不建议使用另一个库。
最简单的答案是在单独的线程中运行每个请求。除非你有数百个,否则应该没问题。(多少数百取决于您的平台。在 Windows 上,限制可能是线程堆栈有多少内存;在大多数其他平台上,截止时间更早。)
如果确实有数百个,则可以将它们放入线程池中。页面中的ThreadPoolExecutor
示例concurrent.futures
几乎正是您所需要的;只需将urllib
呼叫更改为requests
呼叫。(如果你在 2.x 上,请使用futures
PyPI 上相同包的反向移植。)缺点是你实际上并没有一次启动所有 1000 个请求,只是第一个,比如 8 个。
如果你有数百个,并且它们都需要并行,这听起来像是gevent
. 让它对所有内容进行monkeypatch,然后编写与线程完全相同的代码,但greenlet
生成s而不是Thread
s。
grequests
,它直接从旧的异步支持演变而来requests
,有效地为您执行gevent
+requests
包装。对于最简单的情况,它很棒。gevent
但是对于任何重要的事情,我发现阅读显式代码更容易。你的旅费可能会改变。
当然,如果您需要做一些真正花哨的事情,您可能想去twisted
, tornado
, 或tulip
(或等待几个月tulip
成为标准库的一部分)。
它是阻塞的,但这让我想起了我认识的一个整洁的小包装器,我知道它放在 gevent 周围,它回退到 eventlet,然后如果这两个都不存在,则线程。您可以将函数添加到类似于 dicts 或列表的数据结构中,并且一旦添加了函数,它们就会在后台执行,并且一旦它们完成执行,函数返回的值就可以代替函数使用. 它在这里。