簡體   English   中英

python多處理池信號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM