2015-08-13 3 views
0

Мой основной процесс порождает новый процесс, этот новый процесс должен завершиться, если сигнал SIGTERM/SIGKILL отправлен на него. Я новичок в python, и я не знаю, как передать этот сигнал в качестве аргумента функции.Как передать сигнал в качестве параметра в метод в 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 (д, signal.signal (signal.SIGTERM, recieve_signal))

Любая помощь очень ценится

ответ

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 
+0

signal.SIGTERM или любой другой сигнал будет возвращать целое число, я удалил условие Элифа для сигнала о прекращении процесса. –

+0

@AnilPediredla Это прекрасно, все зависит от вас, как вы хотите обработать сигнал. Вам нужно знать что-нибудь еще, или на ваш вопрос достаточно ответили? – plamut

+0

Да, на мой вопрос отвечает. Спасибо за вашу помощь. –