multiprocessing.pool.ThreadPool在jupyter/ipython中没有正确终止



在Jupyter笔记本中使用多处理模块时,我遇到了一个问题,使任务正确超时

超时确实将控制权返回给管理线程,但是子进程仍然在后台执行,可以从子进程中的任何详细语句中看到。

在交互式笔记本中运行时,如何正确地中断/停止子进程?

整个父+子进程在执行相同的代码时终止,如下所示。

from multiprocessing.pool import ThreadPool, TimeoutError
import time
def long_process():
time.sleep(4)
print('I still finished executing')
result = 1
return result
def timeout_wrapper(*args, timeout=0, **kwds):
with ThreadPool(1) as p:
res = p.apply_async(long_process, args=args, kwds=kwds)
try:
result = res.get(timeout=timeout)
except TimeoutError:
result = 0
return result
timeout_wrapper(timeout=1)

好了,经过一番深入研究,发现即使在.py中执行此脚本,后台线程也没有停止。我仍然不知道如何/如果这可以用类似于上面问题的工作流程来完成(如果有人知道,我很乐意学习它),但我确实有一个解决方案,利用multiprocessing中的ProcessQueue

下面的示例返回预期的结果,后台进程被正确终止(在.py中都是在.ipy中)。

from multiprocessing import Process, Queue
from multiprocessing.queues import Empty
import time
def long_process(sleep_time=100, queue=None, **kwargs):
time.sleep(sleep_time)
print('I still finished executing')
queue.put(1)

def timeout_wrapper(*args, timeout=None, **kwargs):
q = Queue(1)
p = Process(target=long_process, args=args, kwargs={'queue': q, **kwargs})
p.start()
try:
result = q.get(timeout=timeout)
except Empty:
result = 0
p.terminate()
print('Result is {}'.format(result))

timeout_wrapper(sleep_time=1)
timeout_wrapper(sleep_time=10, timeout=1)

最新更新