python multiprocessing 接收ctrl+C 杀死进程问题
大致代码是这样的:
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过去时间比较长的命令才会这样)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用那个init_worker在
pool.join
后是无法接收ctrl+c
的。另外
你的生成多进程的代码没有放在
if __name__ == '__main__'
下,这可能会造成问题我记得 ctrl + c 发送的是 15 信号吧, 你直接 kill -9 试试