在Python多处理中,如何为异步传递给进程池的不同函数指定不同的超时?

时间:2013-12-14 00:43:04

标签: python asynchronous timeout multiprocessing pool

我正在尝试将multiprocessing添加到某些代码中,这些代码具有我无法修改的功能。我想将这些函数作为作业异步提交到多处理池。因此,鉴于我无法修改函数,如何为异步传递到多处理进程池的不同函数指定不同的超时?谢谢你的任何建议!


编辑:这个问题不是要求代码;它正在请求建议,一般指导。对所考虑问题的最小理解得到了证明(注意正确使用术语“多处理”,“池”和“异步”)。关于尝试的解决方案,如果不知道如何进行,如何提出尝试解决方案?

此外,正如first response所解释的那样,似乎无法来完成所要求的。换句话说,任何解决方案的尝试都会失败。

1 个答案:

答案 0 :(得分:2)

首先,实际上没有办法在多处理池中为任务设置超时,或者在它们启动后中止它们。您只能终止整个池。

这显然意味着也无法在每项任务上加上不同的超时。

真正做到这一点的唯一方法是在一个过程中运行每个过程,如果超过超时,你可以杀死它。

最简单的方法是在每个子进程的主进程中都有一个线程,因此线程可以在proc.join(timeout)上阻塞,如果proc.is_alive()仍在,则调用proc.terminate()真。

您必须使用Process而不是PoolProcessPoolExecutor这意味着您必须手动传回返回值,这很痛苦。为避免这种情况,您可以使用单进程池/执行程序,提交单个作业,等待AsyncResult / future超时,并terminate池/执行程序(如果它)超时,但由于不同的原因,这看起来有点笨拙。

无论哪种方式,一旦你有了可以等待超时的单进程任务的线程,你只需将线程扔进ncpu worker的池/执行器中并让它完成工作对你而言。