多进程 - python multiprocessing 接收ctrl+C 杀死进程问题

 你不必害怕q因为我会发光 发布于 2022-10-30 12:27

大致代码是这样的:

import time
import string
import os
import subprocess
import multiprocessing
import signal


def init_worker():
    signal.signal(signal.SIGINT, signal.SIG_IGN)

def func(excuteCmd):
    p = subprocess.Popen(excuteCmd, shell=True, stdout=subprocess.PIPE,stderr = subprocess.PIPE)
    a = p.stdout.read()
    p.wait()
    return a

def main():
    nodeList = ['node1', 'node2']
    list = []
    pool = multiprocessing.Pool(len(nodeList),init_worker)
    try:
        for i in range(len(nodeList)):
            node = nodeList[i]
            excuteCmd = 'ssh ' + node + 'XXXXXX'
            result.append(pool.apply_async(func, (excuteCmd, )))
        pool.close()
        pool.join()
    except KeyboardInterrupt:
        print "Caught KeyboardInterrupt, terminating workers"
        pool.terminate()
        pool.join()

main()

这段代码大致写了下,但是现在我有一个命令excuteCmd,这个命令大概作用就是ssh到一个node上面执行一个命令,这个命令持续一分钟,然后取回显,也就是说,每次命令执行完成后有很多回显需要拿回。

所以我想做的就是并行去不同的node上执行命令,并把回显拿回。
这个思路和代码是没问题,但是ctrl+C会有时延,也就是说,如果我半路想取消,ctrl+C下去要过三四十秒才能结束,这是为什么呢?

我能想到的是node如果比较多,命令回显也比较多,ctrl+C的信号就会排队,要等排到才能执行,而不是立即执行,所以请大神赐教,有没有方法可以立即中断。

(如果是比较简单的命令就没问题,唯独ssh过去时间比较长的命令才会这样)

2 个回答
  • 我记得 ctrl + c 发送的是 15 信号吧, 你直接 kill -9 试试

    2022-11-12 01:39 回答
  • 使用那个init_worker在pool.join后是无法接收ctrl+c的。
    另外
    你的生成多进程的代码没有放在if __name__ == '__main__'下,这可能会造成问题

    2022-11-12 01:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有