繁体   English   中英

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

[英]How to put executor.map() in a loop and separate each iteration?

我想将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的所有内容都在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将遍历期货生成器,等待它们全部进行评估,创建一个等待同步点,然后继续

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM