我的程序啓動了一個子進程,它在初始化之後必須向父進程發送某種信號。如果我可以在父項中設置一個處理程序,在發送此信號時調用它,這將是完美的。有什麼辦法可以做到嗎?從正在運行的進程中調用函數
Alendit
我的程序啓動了一個子進程,它在初始化之後必須向父進程發送某種信號。如果我可以在父項中設置一個處理程序,在發送此信號時調用它,這將是完美的。有什麼辦法可以做到嗎?從正在運行的進程中調用函數
Alendit
如果您使用Python 2.6,則可以使用標準庫中的multiprocessing
模塊,特別是管道和隊列。從文檔簡單的例子:
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
如果您使用Python 2.4或2.5,不要絕望 - 一個補丁包,可用here。
您可以使用signal module Python標準庫註冊一個信號處理程序。該子過程然後將使用正常的信號發送機制。
父代碼:
import signal
def my_callback(signal, frame):
print "Signal %d received" % (signal,)
signal.signal(signal.SIGUSR1, my_callback)
# start child
兒童代碼:
import os
import signal
signal.kill(os.getppid(), signal.SIGUSR1)
小心使用這種形式的IPC的,因爲它有它的問題,如:
在原來的Unix系統,當使用建立的 處理程序信號()被 傳遞信號調用,信號的配置 將被重置爲 SIG_DFL,並且系統沒有 塊傳遞信號的其他實例 。 System V還爲信號()提供了 這些語義。這 是壞的,因爲在處理程序 有機會重新建立自己之前,信號可能會再次發送 。 此外,相同信號的快速交付可能導致處理程序的遞歸調用 。
我推薦閱讀整個signal(2)
手冊頁。
如果有辦法將參數發送到父函數,那麼您的解決方案將是完美的。 – user164039 2009-09-08 13:20:17
隨着我的回答,有:-) – 2009-09-08 14:35:29
非常感謝,首先我有點害怕,因爲我實際上必須用python2.5來做,但後臺運行得很好。 – user164039 2009-09-10 10:20:04