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