Python并发期货executor.submit超时

时间:2015-09-21 08:17:05

标签: python multithreading python-3.x concurrency

我想通过线程使用多个线程超时。 我已经使用以下代码:

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)

我已经看过这篇文章How to use concurrent.futures with timeouts?,但我不需要使用结果方法

Python文档不帮助我(https://docs.python.org/3/library/concurrent.futures.html)。它显示了如何使用 map 方法定义超时,但不使用提交。

您是否知道使用 executor.submit 方法定义超时的方法?

编辑:这个例子非常简单。在我的实际案例中,我有一个15000多个项目的列表。每个操作由 executor.submit()在30 - 60秒内运行。但是有些项目在5分钟内动作,我想用这些项目来执行Tiemout。

编辑2 :我想在超时后停止线程。但我不想使用Thread对象。所以这篇文章(Is there any way to kill a Thread in Python?)不能解决我的问题。我只想使用 concurrent.futures 模块。

1 个答案:

答案 0 :(得分:0)

如果你真的想用超时执行异步执行,你可以把你的未来打包到另一个未来,所以最后一个可以等待主要的未来,整个事情将是非阻塞的。像这样:

executor.submit(lambda: executor.submit(func, arg).result(timeout=50))

但这非常草率且无效