Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python并发未来执行器.submit超时_Python_Multithreading_Python 3.x_Concurrency - Fatal编程技术网

Python并发未来执行器.submit超时

Python并发未来执行器.submit超时,python,multithreading,python-3.x,concurrency,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 = 'nam

我想使用多个线程,每个线程都有一个超时。 我已经使用了以下代码:

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)
我已经看过这篇文章,但我不需要使用结果法

Python文档对我没有帮助()。它显示了如何使用map方法定义超时,而不是使用submit

您知道如何使用executor.submit方法定义超时吗

编辑:此示例非常简单。在我的真实案例中,我有一个15000多个项目的列表。executor.submit()在30-60秒内运行的每个操作。但有些项目在5分钟内会发生动作,我希望执行这些项目


编辑2:我想在超时后停止线程。但我不想使用线程对象。所以这篇文章()不能解决我的问题。我只想使用concurrent.futures模块。

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

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


但是这是非常草率和无效的。

提交()超时应该做什么
ThreadPoolExecutor
将提交的项目放入队列,这意味着
submit()
实际上不是一个阻塞操作。阻塞只能在队列已满且默认队列没有限制时发生。是的,此示例非常简单。我已经用更多的细节完成了这篇文章。这与你的代码不符。即使有几千个项目,
submit()
实际上也应该是即时的
submit()
只安排任务(稍后)执行,而不等待任务完成。这段代码中没有任何东西可以让
submit()
花费30秒以上的时间。是的,我同意你的看法。你能想象Action.define_name()方法需要30秒以上的时间吗?我不能发布我公司的真实代码。我发布了一个简单的用例。在这种情况下,您希望在线程已经运行时中断它,而不是等待它的提交
submit()
返回一个
Future
对象,该对象具有一个带有超时的
wait()
方法。你也许可以用这个。但是,编写工作代码可能更优雅,以便在达到超时时自动停止。简单地杀死线程通常不是一个好主意。