在Python多处理中,如何为异步传递到进程池的不同函数指定不同的超时?
我正在尝试添加一些我无法修改的功能的代码。我想将这些函数作为作业异步提交到多处理池。因此,如果我不能修改函数,我如何为异步传递到多处理进程池的不同函数指定不同的超时?谢谢你的建议在Python多处理中,如何为异步传递到进程池的不同函数指定不同的超时?,python,asynchronous,timeout,multiprocessing,pool,Python,Asynchronous,Timeout,Multiprocessing,Pool,我正在尝试添加一些我无法修改的功能的代码。我想将这些函数作为作业异步提交到多处理池。因此,如果我不能修改函数,我如何为异步传递到多处理进程池的不同函数指定不同的超时?谢谢你的建议 编辑:此问题不是请求代码;它正在征求建议和一般指导意见。演示了对所考虑问题的最低限度理解(注意术语“多处理”、“池”和“异步”的正确使用)。关于尝试的解决方案,如果一个人不知道如何继续,他怎么能提出尝试的解决方案 此外,正如作者所解释的,似乎没有办法完成所要求的。换句话说,任何解决方案的尝试都会失败。首先,实际上没有
编辑:此问题不是请求代码;它正在征求建议和一般指导意见。演示了对所考虑问题的最低限度理解(注意术语“多处理”、“池”和“异步”的正确使用)。关于尝试的解决方案,如果一个人不知道如何继续,他怎么能提出尝试的解决方案
此外,正如作者所解释的,似乎没有办法完成所要求的。换句话说,任何解决方案的尝试都会失败。首先,实际上没有办法对多处理池中的任务超时,或者在任务启动后中止它们。您只能终止整个池 这显然意味着也没有办法在每个任务上设置不同的超时 真正做到这一点的唯一方法是在一个进程中运行每一个进程,如果它超过了超时时间,就可以杀死它 最简单的方法是在每个子进程的主进程中都有一个线程,这样线程就可以阻塞,然后在
proc.is\u alive()
仍然为true时调用
您必须使用进程
而不是池
或进程池执行器
这一事实意味着您必须手动传回返回值,这是一种痛苦。为了避免这种情况,您可以使用单个进程池/执行器,提交单个作业,等待带有超时的AsyncResult
/future
,然后在池/执行器超时时终止它,但由于不同的原因,这似乎有点笨拙
无论哪种方式,一旦你有线程可以在单进程任务上等待超时,你只需将线程放入ncpu工作线程池/执行器中,让它为你完成工作。如果你给我们一些实际的代码,这将非常有帮助。如果你以任何方式回答了你之前问题的答案,那么我们就知道你是否理解,你将选择什么,等等。事实上,你问的问题非常模糊,只能得到非常模糊的答案,我怀疑很多人根本懒得回答,因为他们甚至不知道你是否在阅读。代码仍在编写中,我的多处理问题的目的是指导我的编码工作。非常感谢你的邀请。正如我的代码所建议的,我对异步应用任务没有问题;我不反对一次问多个问题。这个问题涉及超时;关注异步结果的管理-两个不同的主题。我尽量不匆忙评估建议的行动方案。我想花时间落实建议,这样我就可以提出合理的后续问题,并公平准确地评估回应。我非常真诚地感谢你在这个问题和上一个问题上的帮助,我请你注意,我的答复中的任何延误都是由于我对你的答复的尊重和不愉快的评估。库允许在计划任务时设置超时。如果任务需要超过给定的超时时间才能完成,则工作进程将重新启动,任务将被丢弃。非常感谢您的建议。为了有效地处理超时,我认为应该生成单独的进程,而不是使用池。但是,我正在试验multiprocessing.pool.ApplyResult
方法get()
。具体来说,我将ApplyResult
对象设置为作业数据属性,然后在使用ApplyResult
get()
方法时使用作业特定超时。@d3pd:我建议考虑使用单进程池/执行器的原因是为了更容易从任务中获取结果。还有其他方法可以做到这一点——队列、管道、带锁的共享列表等等——但必须处理所有的复杂性(包括跨流程边界传递异常)可能会很痛苦。此外,能够重复使用同一个进程(直到它超时并且您必须终止它)可以节省进程启动成本,如果任务较短,在Windows上这可能会非常昂贵。正如我所说,另一方面也有笨拙。