我想将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)
但是它似乎不起作用。它运行循环,但似乎跳过了整个循环主体。我想知道我在哪里做错了,正确的方法是什么。
答案 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
将遍历期货生成器,等待所有人进行评估,创建一个等待同步点,然后继续