【发布时间】:2015-10-04 17:45:25
【问题描述】:
我正在升级我的代码以使用 ThreadPoolExecuter,并希望能够使处理时间超过几秒钟的任何线程超时。是否可以对属于线程池的线程强制超时?我正在使用的代码如下。
with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
future_tasks = {executor.submit(self.crawl_task, url): url for url in self.results.keys()}
for future in concurrent.futures.as_completed(future_tasks):
url = future_tasks[future]
try:
result = future.result()
self.results[result[0]] = result[1]
except Exception as e:
print('%r generated an exception: %s' % (url, e))
我能够使线程超时的唯一方法是更改
for future in concurrent.futures.as_completed(future_tasks):
到
for future in concurrent.futures.as_completed(future_tasks, timeout=1):
但是,这会破坏整个循环,我将无法知道哪个线程超时以及哪些数据导致了超时。
Traceback (most recent call last):
File "test.py", line 75, in <module>
request = Requests(data)
File "test.py", line 22, in __init__
for future in concurrent.futures.as_completed(future_tasks, timeout=1):
File "/source/homebrew/Cellar/python3/3.4.0_1/Frameworks/Python.framework/Versions/3.4/ lib/python3.4/concurrent/futures/_base.py", line 213, in as_completed
len(pending), len(fs)))
concurrent.futures._base.TimeoutError: 17 (of 17) futures unfinished
【问题讨论】:
标签: python multithreading timeout threadpool