2009-09-08 9 views
0

mon programme démarre un sous-processus, qui doit envoyer un type de signal au parent après l'initialisation. Ce serait parfait si je pouvais configurer un gestionnaire dans le parent, qui est appelé quand ce signal est envoyé. Y a-t-il un moyen de le faire?Appel d'une fonction à partir d'un processus en cours

Alendit

Répondre

4

Si vous utilisez Python 2.6, vous pouvez utiliser le module multiprocessing de la bibliothèque standard, en particulier les canaux et les files d'attente. Exemple simple des docs:

from multiprocessing import Process, Pipe 

def f(conn): #This code will be spawned as a new child process 
    conn.send([42, None, 'hello']) #The child process sends a msg to the pipe 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) # prepare to spawn the child 
    p.start() # spawn it 
    print parent_conn.recv() # prints "[42, None, 'hello']" 
    p.join() #wait for child to exit 

Si vous utilisez Python 2.4 ou 2.5, ne désespérez pas - un backport est disponible here.

+0

Merci beaucoup, d'abord j'étais un peu effrayé, parce que je dois en fait le faire avec python2.5, mais les backports fonctionnaient très bien. – user164039

1

Vous pouvez utiliser le signal module de la bibliothèque standard Python pour enregistrer un gestionnaire de signal. Le sous-processus utiliserait alors des mécanismes d'envoi de signaux normaux.

2

Code parent:

import signal 

def my_callback(signal, frame): 
    print "Signal %d received" % (signal,) 

signal.signal(signal.SIGUSR1, my_callback) 
# start child 

Code de l'enfant:

import os 
import signal 

signal.kill(os.getppid(), signal.SIGUSR1) 

Soyez prudent avec cette forme de IPC parce qu'il a ses questions, par exemple:

Dans l'original Systèmes Unix, lorsqu'un gestionnaire a été créé à l'aide dele signal() a été invoqué par la délivrance d'un signal, la disposition du signal serait remis à SIG_DFL, et le système n'a pas livraison de blocs d'instances supplémentaires du signal. Le système V fournit également ces sémantiques pour signal(). Ce était mauvais parce que le signal pouvait être remis à avant que le gestionnaire ait une chance de se rétablir. En outre, les livraisons rapides du même signal pourraient entraîner des invocations récursives du gestionnaire.

Je recommande de lire toute la page de manuel signal(2).

+0

Votre solution serait perfekt, s'il y aurait un moyen d'envoyer des paramètres à la fonction parent. – user164039

+0

Avec ma réponse, il y a :-) –

Questions connexes