【问题标题】:How to pass signal as parameter to a method in python?如何将信号作为参数传递给python中的方法?
【发布时间】:2015-08-13 05:57:26
【问题描述】:

我的主进程产生了一个新进程,如果向它发送 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)) 的信号感到震惊

非常感谢任何帮助

【问题讨论】:

    标签: python python-2.7 signals


    【解决方案1】:

    根据documentationsignal.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
    

    【讨论】:

    • signal.SIGTERM 或任何其他信号将返回一个整数,我已经删除了信号终止进程的 elif 条件。
    • @AnilPediredla 没关系,这完全取决于您要如何处理信号。您是否需要了解其他任何信息,或者您的问题是否得到充分回答?
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2020-07-03
    • 2010-10-16
    相关资源
    最近更新 更多