python - 在多处理中清理子进程
问题描述
考虑一个子进程的简单设置。基本上,这是一个生产者(父母)-消费者(孩子)的场景。
class Job:
def start_process(self):
self.queue = multiprocessing.Queue(3)
self.process = multiprocessing.Process(target=run,
args=(self.queue))
def run(queue):
while True:
item = queue.get()
....
如果我kill -9
在父进程上这样做,孩子将永远挂起。SIGHUP
我确信它会收到subprocess.Popen
- 当 python 进程退出时,popen
ed 也会退出。知道如何解决儿童清理问题吗?
解决方案
如果daemon
参数对您不起作用,您可以捕获一个 SIGINT 信号并让它设置一个布尔值以退出您的孩子的 while 循环。IE..
import signal
g_run_loops = True
def signal_handler(signum, frame):
global g_run_loops
g_run_loops = False
signal.signal(signal.SIGINT, signal_handler)
def run(queue):
global g_run_loops
while g_run_loops:
item = queue.get()
....
请注意,这不适用于 SIGKILL (kill -9),但应该适用于 SIGINT (kill -2)。
推荐阅读
- django - LANGUAGE_SESSION_KEY 不是英文时,Django 表单无效
- javascript - Axios Error 401 (Unauthorized) 尝试获取 api 时出错
- javascript - 如何使用仅包装我的 JavaScript 代码的 npm 包?
- azure-object-anchors - Azure 对象锚点 - Azure 对象锚点支持哪些 3D 模型格式?
- octave - I want to stop the code when x is equal to 1
- shell - shell脚本读取一行并逐行处理
- python-3.x - Python - 即使存在也未检测到网络钓鱼数据集文件
- macos - 如何在文件中的任何 `{` 和 `:` 字符中添加换行符
- python - Pycharm 中的解释器设置存在问题
- c# - c# 10000 x 10000 矩阵乘法