代码之家  ›  专栏  ›  技术社区  ›  MarkMark

并行运行多个子进程-python 2.7

  •  1
  • MarkMark  · 技术社区  · 7 年前

    下面显示的脚本是我尝试使用Linux(Fedora)操作系统上运行的python 2.7 ping多个网络名称空间。

    当前状态和问题 :

    当我运行此文件时;来自elem1(命名空间)的ping存储在一个名为results的文件中。txt。 但是,我似乎无法让循环返回并ping elem2,elem3。。。元素

    尝试的修复程序 :

    我尝试使用“kill-9 p.pid”(如图所示)终止进程,希望这会终止进程,然后在循环的下一次迭代中创建一个新进程。但事实并非如此! 我查过文件了( https://docs.python.org/2/library/subprocess.html )并尝试了kill()、terminate()、removing 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) 你能提出一个实现我上述目标的方法吗?

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   sikr_    7 年前

    除了@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/