使用多处理检测多个子进程的终止

#!/usr/bin/python

import os


from os import getpid


import multiprocessing



build="613719"

file1=open('/auto/home/venkam11/python/install-script/build-ddr-file.txt', 'r')


def installation(model,ddr,build):


    cli = "/auto/tools/qa/shared/qa-branch/util/install.pl -durham -restart -silentinstall -model %s -branch 6.2A %s %s"  %(model, ddr, build)


    print cli

    os.popen2(cli)

    print "installation has started on %s \n" %ddr

如果名称== ' main ':


pid=getpid()


print("parent process id :{}".format(getpid()))


for ddr in file1:

    print ddr.rstrip()

    if 'dd4500' in ddr:

        print "dd4500"

        model = "dd4500"

    elif ('apollo' or 'apolloplus') in ddr:

        print "dd9500"

        model = "dd9500"

    elif 'dd2500' in ddr:

        print "dd2500"

        model = "dd2500"

    elif 'dd7200' in ddr:

        print "dd7200"

        model = "dd7200"

    elif 'jupiter' in ddr:

        print "dd9800"

        model = "dd9800"

    ddr = ddr.rstrip()

    ins=multiprocessing.Process(target=installation, args=(model,ddr,build))

    ins.start()

基本上我试图读取具有机器名称的文件并使用多处理,我想在我读过的机器上安装操作系统。


以上是我的代码,当我运行时,它立即开始在所有机器上安装并且主程序终止。


但我希望主程序不要终止,它必须等到子进程完成作业,并返回输出说子进程作业完成。


安装 make 需要 1 小时或 2 小时,但我希望显示所有流程作业已完成的消息。


任何人都可以在这里帮忙。


拉丁的传说
浏览 154回答 2
2回答

蛊毒传说

欢迎使用 Stackoverflow。与线程非常相似,与子join()进程同步的最简单方法是与它们同步,最常见的是在创建线程/进程中。该os.popen2调用在subprocess引入模块时已被弃用,因为它没有对启动的子进程提供必要的控制和通信程度。为此,您已正确推断出您可以使用该multiprocessing模块。您的问题使用的技术答案multiprocessing已经在另一个答案以及这个问题中得到了很好的介绍,它解释了调用实体如何与其子进程同步。通过将每个子进程存储在列表中来处理未知数量的子进程是完全允许的,例如,像这样for p in my_processes:     p.join()一个更有用的答案可能是该subprocess模块允许创建和监视其他进程而没有 的开销和复杂性multiprocessing,它具有您(还)似乎不需要的进程间通信的高级功能。它的文档有很好的示例,说明如何调整旧的和/或不太合适的 Python 代码以使用新模块,因此值得一看。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python