运行 并行的多个子进程 - python 2.7
Run multiple subprocesses in parallel - python 2.7
下面显示的脚本是我尝试在 Linux (Fedora) OS 上使用 python 2.7 运行ning ping 多个网络命名空间。
现状及问题:
当我运行这个文件;来自 elem1(命名空间)的 ping 被存储在一个名为 results.txt 的文件中。
但是,我似乎无法让循环返回并 ping elem2、elem3、... elemN
已尝试修复:
我尝试使用 "kill -9 p.pid" 终止进程(如图所示),希望这会终止进程,然后可以在循环的下一次迭代中创建一个新进程。然而,这种情况并非如此!
我检查了文档 ( https://docs.python.org/2/library/subprocess.html ) 并尝试了 kill()、terminate()、删除 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. In our case, we need to ping the destination X times. This is specified by using parameter -c X
, where X defines the number of packets to be sent. This parameter can be also combined with parameter -w / -W
which specify the timeout limit for the ping command. Take a look at some examples: https://www.thegeekstuff.com/2009/11/ping-tutorial-13-effective-ping-command-examples/
下面显示的脚本是我尝试在 Linux (Fedora) OS 上使用 python 2.7 运行ning ping 多个网络命名空间。
现状及问题:
当我运行这个文件;来自 elem1(命名空间)的 ping 被存储在一个名为 results.txt 的文件中。 但是,我似乎无法让循环返回并 ping elem2、elem3、... elemN
已尝试修复:
我尝试使用 "kill -9 p.pid" 终止进程(如图所示),希望这会终止进程,然后可以在循环的下一次迭代中创建一个新进程。然而,这种情况并非如此! 我检查了文档 ( https://docs.python.org/2/library/subprocess.html ) 并尝试了 kill()、terminate()、删除 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. In our case, we need to ping the destination X times. This is specified by using parameter -c X
, where X defines the number of packets to be sent. This parameter can be also combined with parameter -w / -W
which specify the timeout limit for the ping command. Take a look at some examples: https://www.thegeekstuff.com/2009/11/ping-tutorial-13-effective-ping-command-examples/