当前位置: 首页 > 知识库问答 >
问题:

使用多处理池时python SIGTERM不工作

李开宇
2023-03-14

按预期更正代码:从多处理导入池导入信号导入时间导入操作系统

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函数被funish时才会调用信号处理程序。所以,使用"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个答案

谭京
2023-03-14

您需要使用map_async方法作为mapone块,直到结果尚未就绪。因此,在您的示例中,terminate的调用永远不会到达。

 类似资料:
  • 问题内容: 我想使用multiprocessing.Pool,但是multiprocessing.Pool不能在超时后中止任务。我找到了解决方案,并对其进行了一些修改。 主要修改-使用 sys.exit(1) 退出工作进程。它杀死了工作进程并杀死了工作线程,但是我不确定这个解决方案是否很好。当进程因正在运行的作业而终止时,我会遇到哪些潜在的问题? 问题答案: 停止正在运行的作业没有隐含的风险,操作

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 问题内容: 我正在尝试并行化脚本,但是由于未知的原因,内核只是冻结而没有引发任何错误。 最小的工作示例: 有趣的是,如果我在另一个文件中定义函数然后将其导入,则一切都可以正常工作。如何使它工作而无需另一个文件? 我使用spyder(anaconda),如果从Windows命令行运行代码,则结果相同。 问题答案: 发生这种情况是因为在子进程导入时,您没有保护代码的“过程”部分免于重新执行。 它们需要

  • 问题内容: 是否有用于工作线程的类,类似于多处理模块的类? 我喜欢例如并行化地图功能的简单方法 但是,我希望这样做而不会产生新流程的开销。 我知道。但是,在我的用例中,该函数将是绑定的函数,python包装器将在实际函数调用之前为其释放。 我必须编写自己的线程池吗? 问题答案: 我刚刚发现模块中实际上 有一个基于线程的Pool接口,但是它有些隐藏并且没有正确记录。 可以通过导入 它是使用包装Pyt

  • 我正在编写一个Java程序,它读取.xlsx文件,并以.csv格式输出。这是我的代码: } 但是,我得到了以下错误: 我已包括以下罐子: dom4j-1.6.jar 我检查了文件格式是.xlsx,也检查了目录,但我不明白问题出在哪里。 如何删除此错误?

  • 我甚至不能使用Python 2.7中运行的多重处理包(使用spyder作为窗口上的用户界面)进行并行处理的最简单的例子,我需要帮助解决这个问题。我已经运行了conda更新,所以所有的包都应该是最新的和兼容的。 即使多处理软件包文档(如下所示)中的第一个示例也不起作用,它会生成4个新进程,但控制台只是挂起。在过去的3天里,我已经尝试了我能找到的一切,但是没有一个不挂起就运行的代码能够将我25%以上的