【发布时间】:2020-05-18 15:31:48
【问题描述】:
我正在处理成千上万的图像 url,并希望使用 concurrent.futures.ProcessPoolExecutor 来加快速度。
由于部分网址损坏或图片较大,处理功能可能会挂起或在处理过程中意外消耗大量时间。我想在处理函数上添加一个超时时间,比如 10 秒,以摆脱这些无效图像。
我尝试在futures .as_completed 中设置timeout 参数,TimeoutException 可以成功提升。但是,似乎主进程仍然会等到超时子进程完成。有没有办法立即杀死超时子进程并将下一个url放入池中?
from concurrent import futures
def process(url):
### Some time consuming operation
return result
def main():
urls = ['url1','url2','url3',...,'url100']
with futures.ProcessPoolExecutor(max_workers=10) as executor:
future_list = {executor.submit(process, url):url for url in urls}
results = []
try:
for future in futures.as_completed(future_list, timeout=10):
results.append(future.result())
except futures._base.TimeoutException:
print("timeout")
print(results)
if __name__ == '__main__':
main()
在上面的例子中,假设我有 100 个 url,其中 10 个是无效的,可能会花费很多时间,如何获取其余 90 个 url 的处理结果列表?
【问题讨论】:
标签: python-3.x multiprocessing python-multiprocessing concurrent.futures