2009-07-17 127 views
3

使用mpirun時,是否可以在正在運行的代碼中捕獲信號(例如,由^C生成的SIGINT)?MPI信號處理

例如,我正在運行一個並行化的Python代碼。我可以用except KeyboardInterrupt自己運行python blah.py來捕捉這些錯誤,但我不能在做mpirun -np 1 python blah.py時。

有沒有人有建議?即使找到如何在C或C++編譯的程序中捕捉信號也是一個有益的開始。

如果我向派生的Python進程發送信號,他們可以正確處理信號;然而,發送到父節點的信號(即,超過羣集上的掛機時間,或者在終端中按下control-C)將立即終止一切。

回答

-1

signal模塊支持使用signal.signal設置信號處理程序:

Set the handler for signal signalnum to the function handler. handler can be a callable Python object taking two arguments (see below), or one of the special values signal.SIG_IGN or signal.SIG_DFL. The previous signal handler will be returned ...

import signal 
def ignore(sig, stack): 
    print "I'm ignoring signal %d" % (sig,) 

signal.signal(signal.SIGINT, ignore) 
while True: pass 

如果發送SIGINT運行此腳本Python解釋器(通過kill -INT <pid>),它將打印一條消息,簡單地繼續跑。

+1

謝謝,但不幸的是,這並沒有真正回答我的問題。我不想知道如何截取Python中的信號;我想知道如何防止`mpirun`首先捕獲它們,或者如何從runner中傳遞它們(`orted`或`ortedrun`)。當執行`mpirun -np 1 python test.py`時,當我點擊control-C或當我發送ortedrun信號時它仍然會死掉。 (如果我確實發現了ortrun生成併發出信號的Python解釋器的pid,這可行;但這不是我想要的。) – 2009-07-18 04:23:29

0

如果您使用mpirun --nw,那麼mpirun本身應該在其開始子流程時立即終止,而不是等待它們的終止;如果這是可以接受的,那麼我相信你的程序將能夠捕捉到他們自己的信號。

+1

由於某種原因,我的mac上的mpirun無法識別此參數(即使它出現在「man」中)。 `mpirun -n 2 --nw python test.py`會給出錯誤:`找不到以下可執行文件:可執行文件:--nw`,並且我嘗試了不同的參數排列,並嘗試使用`-nw`來代替好。任何想法是什麼?謝謝。 – 2009-07-19 17:45:27