[英]python multiprocessing pool signal
我遇到了一個小問題,我是python中的多處理模塊的初學者,我必須創建一個池,該池可以隨時被SIGINT停止。
from multiprocessing import Pool, current_process
import signal
import time
import os
class Processor(object):
def __init__(self, stack):
self.stack = stack
self.pool = Pool(processes=4, maxtasksperchild=1, initializer=self._init)
def _init(self):
cp = current_process()
cp.daemon = False
def launch(self):
self.result = self.pool.map(func, self.stack)
self.pool.close()
self.pool.join()
def func(j):
a, b = j
time.sleep(1)
return a * b
def breaker(*args):
p.pool.terminate()
p.pool.join()
def main():
a = 4, 9
b = 5, 7
lst = [a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b, a, b]
global p
p = Processor(lst)
signal.signal(signal.SIGINT, breaker)
p.launch()
ret = p.result
for i in ret:
print i
if __name__ == '__main__':
print os.getpid()
main()
沒有任何信號,代碼可以完美執行,但是當我向該過程發送信號時,該代碼將不再起作用,並且決不會調用breaker函數。 如果有人知道為什么。
如果添加以下內容,則會調用breaker函數,但不會告訴主程序退出:
sys.exit(os.EX_OK)
或斷路器末端的任何其他出口,則實際上將退出。
你也可能想移動這個:
signal.signal(signal.SIGINT, breaker)
池定義之前,應停止子進程中未處理的鍵盤中斷
要獲得部分結果,您可能需要執行以下操作...
您的發射必須變成:
# start the workers
for el in self.stack:
self.result[el] = self.pool.apply_async(func, (el, ), callback=your_callback)
#wait for results
for work in self.result.items(): # or iteritems if you're on pre python3
work[1].get()
self.pool.close()
self.pool.join()
這將作為異步調用一個一個地處理結果,您的回調將有機會將其保存在以后的地方。
地圖不會為您提供任何信息,因為它在通話結束時僅返回一次,因此您無法獲得部分結果
那么您需要在某個地方將your_callback將結果寫入全局結果列表:
def your_callback(result):
global_list.append(result)
雖然訂購可能遍布各地...
現在您的結果將在global_list中一一顯示,您可以在main()或breaker()中輸出結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.