我有一个调用的过程:
account 1 account 2 ... account n
category 2 5 category 1 15 category 1 22
m 3 category 3 3 category 2 3
category 10 10 category m 15
然后p=multiprocessing.Process(target=func_a)
启动子进程:
func_a
我的问题是,当我致电subprocess.Popen(["nc", "-l", "-p", str(dport)], stdout=open(os.devnull, "w"))
时,它只会杀死第一个孩子。 p.terminate()
是p.terminate()
,因此当我将SIGKILL
调用p.terminate()
时,如何让子流程死亡。
答案 0 :(得分:1)
使用signal.signal注册处理程序,如下所示:
#!/usr/bin/env python
import signal
import sys
def signal_handler(signal, frame):
#iterate over your subprocess and kill them
sys.exit(0)
signal.signal(signal."the signal", signal_handler)
print('Press Ctrl+C')
signal.pause()
有关信号的更多文档可以找到here。
答案 1 :(得分:1)
我找到了一种方法确保子进程在多处理过程被杀死之前被杀死:
创建一个这样的类:
import subprocess
import multiprocessing
import time
import os
class MyProcess(multiprocessing.Process):
def __init__(self):
super(MyProcess,self).__init__()
self.q = multiprocessing.Queue()
def run(self):
# do something else
child = subprocess.Popen(['Your CMD'])
self.q.put(child.pid)
def MyTerminate(self):
pid = self.q.get()
os.kill(pid, 9) # works in windows and linux
# os.popen('taskkill.exe /pid '+str(pid)+' /F') # works only in windows
self.terminate()
然后您可以使用函数MyTerminate()
安全地终止该过程。
例如:
def main():
mp = MyProcess()
mp.start()
time.sleep(1)
mp.MyTerminate()
子过程“孩子”将在1秒后被杀死。