2014-01-14 96 views
0

我產生了幾個multiprocessing.Process es分擔工作量到不同的過程。 現在我希望能夠通過按Ctrl-C關閉整個程序,但是信號只發送給孩子而不發送給父進程。信號由孩子處理,但不是由父進程處理?

我的程序是這樣的:

import sys 
import multiprocessing 
import signal 

# ignoring handler, signal.SIG_IGN is not working on windows 
def sighandler(signal, frame): 
    pass  

# worker thread definiton 
def worker(): 
    signal.signal(signal.SIGINT, sighandler) 
    signal.signal(signal.SIGTERM, sighandler) 

    # do stuff here... 

def main(): 
    num_procs = 4 
    procs = [] 
    print("Starting up %d processes:" %num_procs) 
    for i in range(num_procs): 
     print("\tstarting worker %d..." %(i+1)) 
     p = multiprocessing.Process(target=worker) 
     procs.append(p) 
     p.start() 

    print("All processes started...") 
    try: 
     for p in procs: 
      p.join() 
    except KeyboardInterrupt as e: 
     print "STOPPING" 

     for p in procs: 
      p.terminate() 

     sys.exit(0) 

但只有sighandler被稱爲4倍,如果我按Ctrl-C。當我在父進程中註冊信號時,處理程序不會被調用,KeyboardInterrupt異常也不會起作用。 我可以停止從內部的子進程嗎?處理程序內部的sys.exit(0)不適用於我。

回答

0

您是否嘗試過使用os._exit(n)

從文檔:

退出狀態爲n個過程,而不調用清除處理,刷新stdio的緩衝區等

可用性:Unix中,Windows操作系統。

注意退出的標準方式是sys.exit(n)。 _exit()通常應該只在fork()之後的子進程中使用。

http://docs.python.org/2/library/os.html#os._exit

+1

很好,有趣的是,如果我這樣做在信號處理程序,即使是'KeyboardInterrupt'完美地處理... – reox