14

可能重复:
带有 Python 请求的异步请求

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

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

4

2 回答 2

51

urllib2,requests正在阻塞。

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

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

如果确实有数百个,则可以将它们放入线程池中。页面中的ThreadPoolExecutor示例concurrent.futures几乎正是您所需要的;只需将urllib呼叫更改为requests呼叫。(如果你在 2.x 上,请使用futuresPyPI 上相同包的反向移植。)缺点是你实际上并没有一次启动所有 1000 个请求,只是第一个,比如 8 个。

如果你有数百个,并且它们都需要并行,这听起来像是gevent. 让它对所有内容进行monkeypatch,然后编写与线程完全相同的代码,但greenlet生成s而不是Threads。

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

当然,如果您需要做一些真正花哨的事情,您可能想去twisted, tornado, 或tulip(或等待几个月tulip成为标准库的一部分)。

于 2013-01-09T20:39:16.440 回答
2

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

于 2013-01-09T20:48:51.927 回答