我的主进程产生一个新进程,如果发送SIGTERM / SIGKILL信号,这个新进程需要终止。我是python的新手,我不知道如何将此信号作为参数传递给函数。
我的代码是:
import os
import random
import time
import sys
import multiprocessing as mp
import psutil
import signal
def info(title):
print (title)
print ('module name:', __name__)
if hasattr(os, 'getppid'):
print ('parent process:', os.getppid())
print ('process id:', os.getpid())
def foo(q,num):
info('function foo')
if type(num) is int:
num*=2
q.put(num)
elif type(num) is Signal:
print ("Terminated")
time.sleep(10)
os.kill(os.getpgid(pid), num)
else :
sys.exit("error")
def receive_signal(signum, stack):
print 'Received:', signum
if __name__ == '__main__':
info ("main")
#mp.set_default('spawn')
number = random.randint(0,100)
print ("Initial number: ",number)
q = mp.Queue()
p = mp.Process(target=foo, args=(q,number))
p.start()
print ("Final Number: ",(q.get()))
foo(q,signal.signal(signal.SIGTERM,recieve_signal))
p.join()
此刻我对信号传递给函数foo感到震惊(q,signal.signal(signal.SIGTERM,recieve_signal))
非常感谢任何帮助
答案 0 :(得分:1)
根据documentation,signal.signal(...)
只会注册一个信号,但它不会返回任何值,而None
会传递给您的foo()
函数:
foo(q,signal.signal(signal.SIGTERM,recieve_signal))
另一方面,signal.signal()
的第二个参数是在捕获特定类型的信号时调用的回调(在您的情况下为signal.SIGTERM
)。您已经定义了这样的处理程序,它是receive_signal()
函数,它的第一个参数是信号编号。您可以通过简单地调用它来将其传递给foo()
函数:
def receive_signal(signum, stack):
print 'Received:', signum
foo(q, signum) # NOTE: q is a module-level variable here