我想使用多线程并设置每个线程的超时时间。我已经使用了以下代码:
import concurrent.futures
class Action:
def __init(self):
self.name = 'initial'
def define_name(self):
# In my real code this method is executed during 30-60 seconds
self.name = 'name'
action_list = [
Action(),
Action(),
]
with concurrent.futures.ThreadPoolExecutor(
max_workers = 20
) as executor:
for action_item in action_list:
# without timeout arg, it works !
executor.submit(action_item.define_name, timeout=1)
for action_item in action_list:
print(action_item.name)
我已经看到了这篇文章如何在 concurrent.futures 中使用超时?但是我不需要使用 result 方法。
Python 文档对我没有帮助 (https://docs.python.org/3/library/concurrent.futures.html)。它展示了如何使用 map 方法来定义超时,但没有使用 submit。
您知道如何使用 executor.submit 方法来定义超时吗?
编辑:这个例子非常简单。在我的实际情况中,我有一个包含 15000+ 个项目的列表。每个由 executor.submit() 运行的操作需要 30-60 秒。但是一些项目需要超过 5 分钟的时间,我想要排除这些项目的超时。
编辑2:我想在超时后停止一个线程。但我不想使用 Thread 对象。因此,这篇文章 (有没有一种方法可以在 Python 中杀死线程? ) 不能解决我的问题。我只想使用 concurrent.futures 模块。
submit()
超时是用来做什么的?ThreadPoolExecutor
将提交的项放入队列中,这意味着submit()
不是真正的阻塞操作。只有当队列已满并且默认队列无限制时才会发生阻塞。 - dhkesubmit()
应该是几乎瞬间完成的。submit()
只是安排一个任务以供(稍后)执行,它不会等待任务完成。在这段代码中没有任何东西应该让submit()
花费 30 秒以上的时间。 - dhkesubmit()
返回一个具有超时的wait()
方法的Future
对象。您可能可以使用它。但更优雅的做法是编写工作代码,使其在达到超时时自动停止。通常直接杀死一个线程并不是一个好主意。 - dhke