【发布时间】:2020-11-22 06:38:20
【问题描述】:
我正在运行一个webscraper class,其方法名称是self.get_with_random_proxy_using_chain。
我正在尝试向同一个 url 发送多线程调用,并且希望一旦有来自任何线程的结果,该方法会返回响应并关闭其他仍处于活动状态的线程。
到目前为止,我的代码看起来像这样(可能很天真):
from concurrent.futures import ThreadPoolExecutor, as_completed
# class initiation etc
max_workers = cpu_count() * 5
urls = [url_to_open] * 50
with ThreadPoolExecutor(max_workers=max_workers) as executor:
future_to_url=[]
for url in urls: # i had to do a loop to include sleep not to overload the proxy server
future_to_url.append(executor.submit(self.get_with_random_proxy_using_chain,
url,
timeout,
update_proxy_score,
unwanted_keywords,
unwanted_status_codes,
random_universe_size,
file_path_to_save_streamed_content))
sleep(0.5)
for future in as_completed(future_to_url):
if future.result() is not None:
return future.result()
但它运行所有线程。
有没有办法在第一个未来完成后关闭所有线程。 我正在使用 windows 和 python 3.7x
到目前为止,我找到了这个link,但我无法让它工作(pogram 仍然运行很长时间)。
【问题讨论】:
-
“返回结果”是什么意思?看起来它将返回第一个结果并让所有其他线程完成,而忽略它们的结果。如何从一个 return 语句中获得多个连续结果?
-
目前它返回一个值(正确),但在遍历所有期货之后。我想在找到第一个结果后停止所有线程/期货。进一步看,我看到了这一点; stackoverflow.com/questions/52631315/…,但找不到 _threads 属性(我编辑了我的问题)
标签: python python-3.x python-multithreading threadpoolexecutor