如何将executor.map()置于循环中并分离每个迭代?

时间:2019-08-02 19:12:59

标签: python pandas concurrent.futures

我想将HTTP请求发送到10,000个主机,并且我有5个不同的标头值。我想发送带有第一个标头值的10,000个请求,等待它完成,然后在每个要使用10,000个线程来固定进程的10,000个请求中,启动带有第二个标头值的第二个10,000个请求。

要使用mutilpthread将请求仅发送到10,000个主机,我可以使用以下代码:

with concurrent.futures.ThreadPoolExecutor(max_workers = CONNECTIONS) as executor:
  args = ((url, header) for url in urls)
  executor.map(lambda p: send_request(*p), args) 

要实现我最终想要的功能,我正在考虑以上述方式包装上面的代码:

for header in headers:
  with concurrent.futures.ThreadPoolExecutor(max_workers = CONNECTIONS) as executor:
    args = ((url, header) for url in urls)
    executor.map(lambda p: send_request(*p), args) 

但是它似乎不起作用。它运行循环,但似乎跳过了整个循环主体。我想知道我在哪里做错了,正确的方法是什么。

1 个答案:

答案 0 :(得分:0)

您没有捕获地图的期货收益并等待结果。这是您需要的同步点,以便“标题1的所有内容都在2之前完成”

有很多方法可以做到这一点,例如使用as_completed,但是在您的情况下,您需要做的只是虚拟评估/等待结果:

for header in headers:
  with concurrent.futures.ThreadPoolExecutor(max_workers = CONNECTIONS) as executor:
    args = ((url, header) for url in urls)
    futures = executor.map(lambda p: send_request(*p), args)
    list(futures)

在这种情况下,list将遍历期货生成器,等待所有人进行评估,创建一个等待同步点,然后继续