gpt4 book ai didi

python - 从基于 Gunicorn 的 Web session 终止异步多处理线程

转载 作者:行者123 更新时间:2023-12-01 04:35:10 25 4
gpt4 key购买 nike

我使用 Django 为多核科学计算库创建基于浏览器的 GUI,并使用 Gunicorn 作为网络服务器(另请参阅 Start multicore background process from Django view )。我按如下方式调用库函数:

p = multiprocessing.Process(target=library_function, args=())
p.start()
print("test")

库函数本身处理多核逻辑,因此我在这里使用多处理模块的目的是使用户能够终止进程(通过p.terminate())。然而,目前这不起作用。我的假设是我还需要 p.join() 来终止library_function() 调用的任何内容。问题是,当我在 p.start() 之后调用 p.join() 时,该过程似乎不再异步运行,即在示例中,即“test”不会立即打印。但是,在我的用例中绝对需要异步。

有人知道如何(1)在后台运行该进程以及(2)仍然允许用户终止该进程吗?

更新

根据 noxdafox 的评论,这是我现在的快速而肮脏的解决方案:

import psutil, signal, os, multiprocessing

# start process
p = multiprocessing.Process(target=library_function, args=())
p.start()

# stop process
for child in psutil.Process(p.pid).children(recursive=True):
child.kill() # kill child processes
os.kill(p.pid, signal.SIGKILL) # kill parent process
p.join() # kills parent zombie process

最佳答案

调用p.terminate()会向进程发送一个SIGTERM信号。默认情况下,Python 解释器会在此类信号上退出,但在某些情况下不会退出:

  • 该进程正在覆盖 SIGTERM 信号的默认行为。例如,这可能是由 Django 框架本身设置的(我不知道它的内部结构)。
  • 该进程正在等待 C/C++ 调用返回,并且无法对 SIGTERM 信号使用react。

p.join() 阻塞调用者,直到子进程没有结束。必须始终调用它以清理过期的子进程。失去并行性的原因是您启动新进程并等待它完成。

您可以使用Pebble如果您想在单独的进程上生成任务并安全终止它,请使用库:

from pebble import process

@process.concurrent
def library_function( ... ):
return

task = library_function( ... )
task.cancel()

更简单。

from pebble import process

task = process.concurrent(target=library_function, args=( ... ))
task.cancel()

编辑:您想要做的事情不同,并且您目前尝试做的方式有点危险。

在子进程中运行进程池(来自 multiprocessing.Process 而不是 subprocess)并不是非常理想。此外,终止包含Pool的进程会导致所有工作进程的泄漏。

来自documentation of Parallel这是在后台使用的进程池的实现。

Interruption of multiprocesses jobs with ‘Ctrl-C’

要实现这一点,您可以向子进程发送 SIGINT 信号并查看它是否确实有效。

import multiprocessing, signal, os

p = multiprocessing.Process(target=library_function, args=())
p.start()

# stop the job
os.kill(p.pid, signal.SIGINT)
p.join()

关于python - 从基于 Gunicorn 的 Web session 终止异步多处理线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31827503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com