当我使用多处理池时,python SIGTERM不起作用

时间:2017-08-15 14:17:04

标签: python-2.7 multiprocessing python-multiprocessing pool sigterm

按预期更正代码:     来自多处理导入池     进口信号     进口时间     import os

def consumer(i):
    while True:
        # print os.getpid()
        pass
def handler(signum, frame):
    print 'Here you go'

signal.signal(signal.SIGTERM, handler)
p = Pool(5)
p.map_async(consumer, [1 for i in range(5)])

while True:
    pass

p.terminate()
# p.close()
p.join()

=============================================== ===

我发现了这个问题,当我使用map函数时,主func被阻塞,只有当map函数出现时才会调用信号处理程序。 因此,使用“map_async”函数可以更好地解决这个问题。

这是我发现的:

纯粹在C中实现的长时间运行计算(例如在大量文本上进行正则表达式匹配)可以在任意时间内不间断地运行,无论接收到任何信号。计算完成后将调用Python信号处理程序。

=============================================== ===

我编写了一个类似下面的程序,当我在终端中键入“kill pid”时,我希望在程序中退出/(就像程序打印字符串一样),但它不起作用。是否有任何其他策略阻止SIGTERM进入主函数。

from multiprocessing import Pool
import signal
import time
import os

def consumer(i):
    while True:
        # print os.getpid()
        pass
def handler(signum, frame):
    print 'Here you go'

signal.signal(signal.SIGTERM, handler)
p = Pool(5)
p.map(consumer, [1 for i in range(5)])

p.terminate()
# p.close()
p.join()

1 个答案:

答案 0 :(得分:1)

您需要使用map_async方法作为map一个块,直到结果未准备好。因此,在您的示例中,永远不会调用terminate