Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python多处理池信号_Python_Signals_Multiprocessing_Pool - Fatal编程技术网

python多处理池信号

python多处理池信号,python,signals,multiprocessing,pool,Python,Signals,Multiprocessing,Pool,我遇到了一个小问题,我是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(pro

我遇到了一个小问题,我是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函数。
如果有人知道原因。

断路器函数确实会被调用,但它不会告诉您的main退出,如果您添加:

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()
这将一个接一个地将结果作为异步调用进行处理,您的回调将有机会将它们保存在某个位置以备以后使用

map不会给您这个结果,因为它在调用结束时只返回一次,所以您无法获得部分结果

然后,您需要将结果写入全局结果列表的某个位置的_回调:

def your_callback(result):
    global_list.append(result)
不过,订单可能到处都是


现在,您的结果将在全局列表中一个接一个地显示出来,您可以在main()或breaker()中输出此结果。

您的解决方案工作正常,但我还有一个问题,上面没有提到。我怎样才能得到map的结果,因为我在他跑步时阻止了他,但在我发送信号之前,他可能已经完成了一些任务。但我找不到。你知道为什么吗?恐怕检索部分结果会有更大的问题。。。map可能不是您想要使用的,我可以发布一些代码,这些代码可以在几分钟内完成。谢谢您的帮助。我不再使用map了,我现在使用的是apply\u async。您的解决方案非常有效。非常感谢