【问题标题】:Python Requests non-blocking? [duplicate]Python请求非阻塞? [复制]
【发布时间】:2012-12-24 03:15:52
【问题描述】:

可能重复:
Asynchronous Requests with Python requests

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

如果它是阻塞的,你会推荐哪个模块?

【问题讨论】:

    标签: python python-requests


    【解决方案1】:

    urllib2requests 正在阻塞。

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-03-04
        • 2013-11-12
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2015-10-16
        • 1970-01-01
        相关资源
        最近更新 更多