[英]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.