并行运行多个子进程 - python 2.7
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并行运行多个子进程 - python 2.7相关的知识,希望对你有一定的参考价值。
下面显示的脚本是我尝试使用在Linux(Fedora)操作系统上运行的python 2.7来ping多个网络命名空间。
现状和问题:
当我运行这个文件; elem1(命名空间)中的ping存储在名为results.txt的文件中。但是,我似乎无法让循环回来并ping elem2,elem3,... elemN
尝试修复:
我尝试使用“kill -9 p.pid”(如图所示)杀死进程,希望这会终止进程,然后在循环的下一次迭代中创建一个新进程。然而,这种情况并非如此!我检查了文档(https://docs.python.org/2/library/subprocess.html)并尝试了几种不同的kill()排列,终止(),删除shell = True等......但无济于事。
import time
import os
import signal
import subprocess
IP_ADDR="192.168.1.1"
def main():
arry =["elem1", "elem2", "elem3", "elem4", "elem5", "elem6", "elem7"] array of network namespaces's to ping
with open('results.txt', 'a+') as outfile:
for elem in arry:
command = "ip netns exec {0} ping {1}".format(elem, IP_ADDR)
outfile.write("\n\nPinging {}\n".format(elem))
p = subprocess.Popen(command, shell=True, stdout=outfile)
command_kill = "kill -9 {}".format(p.pid)
time.sleep(2) #wait 5 seconds
p.kill()
outfile.close()
if __name__ == '__main__':
main()
我的问题:
(1)有人能解释代码在这里做了什么吗?
(2)你能否提出实现上述目标的方法?
谢谢
除了@chepner提到的修改,你可以尝试使用subprocess.call()
而不是subprocess.Popen()
。后一种方法没有阻塞,这导致所有命令同时执行。但是,call()
是阻塞的,因此您的脚本将等到ping完成后再进入循环的下一次迭代。这将导致命令的输出按顺序排列而不是交错。
如果你需要并行执行命令,我建议将输出写入不同的文件,并在所有命令完成后将它们组合起来。
编辑:我在这方面没有特别的经验,但我猜终止问题只与ping
命令有关。查看手册页:https://linux.die.net/man/8/ping。在我们的例子中,我们需要ping目的地X次。这是通过使用参数-c X
指定的,其中X定义了要发送的数据包的数量。此参数还可以与参数-w / -W
结合使用,后者指定ping命令的超时限制。看看一些例子:https://www.thegeekstuff.com/2009/11/ping-tutorial-13-effective-ping-command-examples/
以上是关于并行运行多个子进程 - python 2.7的主要内容,如果未能解决你的问题,请参考以下文章
多个子进程中的 Pyhtion 2.7 记录器不会将信息记录到日志文件中
python 并行启动多个子进程并对每个进程进行轮询/等待以确保它完成。最初来自http://stackoverflow.com