我正在运行一段 python 代码,其中多个线程通过线程池执行程序运行。每个线程都应该执行一项任务(例如获取网页)。我希望能够做的是终止所有线程,即使其中一个线程失败。例如:
with ThreadPoolExecutor(self._num_threads) as executor:
jobs = []
for path in paths:
kw = {"path": path}
jobs.append(executor.submit(start,**kw))
for job in futures.as_completed(jobs):
result = job.result()
print(result)
def start(*args,**kwargs):
#fetch the page
if(success):
return True
else:
#Signal all threads to stop
Run Code Online (Sandbox Code Playgroud)
有可能这样做吗?除非所有线程都成功,否则线程返回的结果对我来说是无用的,因此即使其中一个失败,我也想节省其余线程的一些执行时间并立即终止它们。实际代码显然正在执行相对冗长的任务,有几个故障点。
最优雅/ Python化的实现方式是:“如果列表中总值的x%大于y,则返回true”。我目前已经实现了一个功能:
def check(listItems, val):
'''A method to check all elements of a list against a given value.
Returns true if all items of list are greater than value.'''
return all(x>val for x in listItems)
Run Code Online (Sandbox Code Playgroud)
但是对于我的用例来说,等待这种特殊条件是非常昂贵的,而且没有用。如果列表中〜80%的项目大于给定值,我想继续。我想到的一种方法是按降序对列表进行排序,创建另一个列表,然后将列表元素的80%复制到新列表中,然后为该新列表运行函数。但是,我希望必须有一种更优雅的方法。有什么建议么?