Python - 并行运行多个获取请求并在第一次响应时停止

标签 python parallel-processing python-requests python-multiprocessing

python 3.4

请求 2.18

我想进行多次 requests.get 调用并返回第一个获得响应的调用,停止其余调用。最好的方法是什么?

编辑:我最终使用 python 的 multiprocessing 模块和一个队列来实现结果,就像评论中建议的 petre 一样。这是代码:

from multiprocessing import Queue, Process
from multiprocessing.queues import Empty
from requests import head


def _req(url, queue):
    a = head(url)
    if a.status_code == 200:
        queue.put(a)
    return


def head_all_get_first(urls):
    jobs = []
    q = Queue()
    for url in urls:
        p = Process(target=_req, args=(url, q))
        jobs.append(p)
    for p in jobs:
        p.start()
    try:
        ret = q.get(timeout=20)  # blocking get - wait at most 20 seconds for a return
    except Empty:  # thrown if the timeout is exceeded
        ret = None
    for p in jobs:
        p.terminate()
    return ret

最佳答案

让我们看看可能性:

Python 主要使用基于 GIL 的执行步进 pure-[SERIAL]代码执行,因此最大可以达到的是 "just"-[CONCURRENT]代码执行流程,而不是 true-[PARALLEL]系统调度(进一步的细节远远超出了这篇文章,但现在不需要呈现下面提到的选项)。

您的描述可以这样填充:
- 使用分布式系统(一个协调的、多代理的、双向对话的处理器网络)
- 使用基于 GIL 多路复用的 python 线程后端(如 multiprocessing )
- 使用独立于 GIL 的基于 python 子进程的后端(如 joblib )

在所有情况下,此类代码执行基础结构的设置和终止的“成本”总和会有所不同(其中基于子流程的将是最昂贵的,因为它总是首先生成一个 < strong>python 解释器初始状态的完整副本,包括它的所有内存分配等,这对于“处理小块肉”来说非常昂贵,所以如果需要速度和剃须 -将任何延迟降低到毫秒级,可以直接排除这个)。

(最好是半持久的)多代理网络的一个很好的例子是使用 ZeroMQnanomsg 代理间中介工具(其中广泛的传输classes { inproc://| ipc://| tcp://| ... | vmci://} 允许一个人在本地/分布式布局中运行智能解决方案并达到“第一个回答“状态可以是智能的、快速的和廉价的”广告”给合作代理组的所有其他成员,这不是第一个。

enter image description here

VentilatorSink 角色可以在同一个 python 进程中,可以是类方法,也可以是命令式代码的某些本地多路复用部分的形式,也可以是统一的 PUSH-如果即将实现非同质任务分配,策略可能会变得更加智能(但运行多智能体处理智能网络的原则是可行的方法)。

关于Python - 并行运行多个获取请求并在第一次响应时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677978/

相关文章:

python 2.7 : delete item from list by value

python - 如何使用 python Flask 防止长时间运行的工作负载出现 230 秒的 azure 网关超时

python - MRJob 中的 mapper_pre_filter

python - Django Rest Framework - 'module' 对象没有属性 'HStoreField'

c++ - 嵌套并行 omp v. 2.0 性能

ruby-on-rails - 使用 parallel_tests 测试在运行中被杀死

python - 从单个脚本运行多个 python 脚本,并在它们之间来回通信?

python - 使用Python解析未知数据类型对象Json

python - 如何使用 requests 捕获发布请求的结果页面?

python - MyPy:请求对象的类型是什么?