我正在尝试将multiprocessing添加到某些代码中,这些代码具有我无法修改的功能。我想将这些函数作为作业异步提交到多处理池。因此,鉴于我无法修改函数,如何为异步传递到多处理进程池的不同函数指定不同的超时?谢谢你的任何建议!
编辑:这个问题不是要求代码;它正在请求建议,一般指导。对所考虑问题的最小理解得到了证明(注意正确使用术语“多处理”,“池”和“异步”)。关于尝试的解决方案,如果不知道如何进行,如何提出尝试解决方案?
此外,正如first response所解释的那样,似乎无法来完成所要求的。换句话说,任何解决方案的尝试都会失败。
答案 0 :(得分:2)
首先,实际上没有办法在多处理池中为任务设置超时,或者在它们启动后中止它们。您只能终止整个池。
这显然意味着也无法在每项任务上加上不同的超时。
真正做到这一点的唯一方法是在一个过程中运行每个过程,如果超过超时,你可以杀死它。
最简单的方法是在每个子进程的主进程中都有一个线程,因此线程可以在proc.join(timeout)
上阻塞,如果proc.is_alive()
仍在,则调用proc.terminate()
真。
您必须使用Process
而不是Pool
或ProcessPoolExecutor
这意味着您必须手动传回返回值,这很痛苦。为避免这种情况,您可以使用单进程池/执行程序,提交单个作业,等待AsyncResult
/ future
超时,并terminate
池/执行程序(如果它)超时,但由于不同的原因,这看起来有点笨拙。
无论哪种方式,一旦你有了可以等待超时的单进程任务的线程,你只需将线程扔进ncpu worker的池/执行器中并让它完成工作对你而言。