中斷我發現this文章中介紹如何殺死使用CTR + C運行多碼。以下代碼是完全工作(它可以使用CTRL + C被終止的話):鍵盤與Python的多處理池和地圖功能
#!/usr/bin/env python
# Copyright (c) 2011 John Reese
# Licensed under the MIT License
import multiprocessing
import os
import signal
import time
def init_worker():
signal.signal(signal.SIGINT, signal.SIG_IGN)
def run_worker():
time.sleep(15)
def main():
print "Initializng 5 workers"
pool = multiprocessing.Pool(5, init_worker)
print "Starting 3 jobs of 15 seconds each"
for i in range(3):
pool.apply_async(run_worker)
try:
print "Waiting 10 seconds"
time.sleep(10)
except KeyboardInterrupt:
print "Caught KeyboardInterrupt, terminating workers"
pool.terminate()
pool.join()
else:
print "Quitting normally"
pool.close()
pool.join()
if __name__ == "__main__":
main()
的問題是,我使用不同的函數從多處理模塊。我不知道它們與以前的方法有什麼不同,它只適用於我(除了這個例子不能用ctrl + c來終止它)。這是我一直在努力根據以上的版本進行修改(不包括信號以前的版本處理用於印刷回溯當CTRL + C被擊中)代碼:
#!/usr/bin/env python
from time import sleep
import signal
from multiprocessing import Pool
from multiprocessing import cpu_count
def init_worker(n):
signal.signal(signal.SIGINT, signal.SIG_IGN)
sleep(.5)
print "n = %d" % n
results_sent_back_to_parent = n * n
return results_sent_back_to_parent
if __name__ == '__main__':
try:
p = Pool(processes = cpu_count())
results = p.map(init_worker, range(50), chunksize = 10)
except KeyboardInterrupt:
pool.terminate()
pool.join()
print(results)
問題:
- 爲什麼CTRL + C在第一個例子中工作,但不是在第二
- 如何修改第二個代碼,CTRL + C是否行得通呢?
- 如何既代碼不同(我的意思是在多的情況下,一個使用例如
pool.apply_async
和另一map
)?
編輯
在回覆@ user2386841
我在init_worker
評論signal.signal(signal.SIGINT, signal.SIG_IGN)
並試圖if __name__ == '__main__':
後添加正確的,但是當我增加一條,作爲最後一個ID沒有工作,同在try:
塊行
在答覆@ThomasWagenaar
它的行爲完全相同(我也嘗試了上述信號處理器的各個位置);儘管打ctr+c
和唯一可能的方式殺死腳本數字印刷是使用ctrl+z
,然後用kill %1
嗯,不知道關於這一點,但我注意到,在主進程的第一段代碼中有十秒鐘的時間,這會讓您停止進程的oppurtunity。如果在結果= 10秒後添加10秒的time.sleep會發生什麼?在主進程中的第二段代碼中,然後按ctrl + c幾次?讓我知道如果我是對/錯! –
可能重複[鍵盤中斷與python的多處理池](https://stackoverflow.com/questions/1408356/keyboard-interrupts-with-pythons-multiprocessing-pool) – tabata