【问题标题】:communicattion between process and subprocess进程和子进程之间的通信
【发布时间】:2018-09-16 06:21:34
【问题描述】:

我编写了一个小型多进程程序,并期望该订单会 以下方式。

hello number
ls -l <output>

但它没有工作。所以我相信父进程不知道子进程。 主进程如何等待子进程完成。或者我缺少非常基本的 多处理的概念

#!/usr/bin/env python
import multiprocessing
import subprocess

def run_command():
    pipe = subprocess.Popen("ls -l", stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE,
                                    shell=True)
    out, err = pipe.communicate()
    pipe.wait()
    print out, err

def msg(number):
    print "hello %s" %(number)
    run_command()

def main():
    print "yes"
    procs = []
    for i in range(0, 100, 1):
        process = multiprocessing.Process(target=msg, args=(i,))
        procs.append(process)
    for proc in procs:
        proc.start()
    for proc in procs:
        proc.join()

if __name__ == "__main__":
    main()

Expected code:
hello 0
total 4
-rw-rw-r-- 1 goswamia <#> 682 Apr  6 02:51 check_process.py

hello 1
total 4
-rw-rw-r-- 1 goswamia <#> 682 Apr  6 02:51 check_process.py

etc

获取输出: python check_process.py

yes
hello 0
hello 1
hello 2
hello 3
hello 4
total 4
-rw-rw-r-- 1 goswamia <#> 682 Apr  6 02:51 check_process.py

total 4
-rw-rw-r-- 1 goswamia <#> 682 Apr  6 02:51 check_process.py

total 4
-rw-rw-r-- 1 goswamia <#> 682 Apr  6 02:51 check_process.py

total 4
-rw-rw-r-- 1 goswamia <#> 682 Apr  6 02:51 check_process.py

total 4
-rw-rw-r-- 1 goswamia <#> 682 Apr  6 02:51 check_process.py

【问题讨论】:

  • 不是先启动每个进程,然后等待每个进程完成,您必须等待每个进程完成之前开始下一个过程。只需删除第二个for proc in procs:
  • 但是多处理的整个概念似乎毫无意义。
  • 如果进程创建子进程我想让子进程完成并执行并行操作,我该如何处理这种情况
  • 并行工作在startjoin 之间完成。
  • 是的,而不是进程调用另一个函数。我想等待完成这样的功能

标签: python python-2.7 multiprocessing


【解决方案1】:

似乎没有使用 pipe.wait()

已编辑:错过放置 pipe.wait() 你应该放置你的 pipe.wait() 就像这个编辑过的代码

这是您编辑的代码

#!/usr/bin/env python
import multiprocessing
import subprocess


def msg(number):
    # this command for sub process
    pipe = subprocess.Popen("ls -l", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

    # this command that runing in main process
    out, err = pipe.communicate()
    print "hello %s" %(number)
    print out, err

    # this make sub prosses waits for the command in main process to finish
    pipe.wait()

def main():
    print "yes"
    procs = []
    for i in range(0, 5, 1):
        process = multiprocessing.Process(target=msg, args=(i,))
        procs.append(process)
    for proc in procs:
        proc.start()
    for proc in procs:
        proc.join()

if __name__ == "__main__":
    main()

该订单将遵循假设

hello number
ls -l <output>

其他人已经解释了这个Using subprocess module to work in parallel (Multi-process)

您的第一个代码在单独的进程中执行并且输出无序,因为后台进程和前台进程也是独立的进程。

【讨论】:

  • 我在我的代码中使用了 pipe.wait() 我无法将这两个函数结合到我的进程中,该进程正在调用另一个工具并执行其他操作。这种情况能处理吗
  • 是可能的,您可以在子进程等待其父进程(主进程)时在主进程内运行多进程和子进程。您可以在此处docs.python.org/2.7/library/multiprocessing.html 阅读 python 文档中的更多详细信息
【解决方案2】:

我能够脱身,但无法理解下一行。如果我评论输出的顺序不正确,它真的在做什么

psutil.Process(proc.pid).children()(看不懂)

#!/usr/bin/env python
import multiprocessing
import subprocess
import psutil

def run_command():
    pipe = subprocess.Popen("ls", stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE,
                                    shell=True)
    out, err = pipe.communicate()
    print out, err

def msg(number):
    print "hello %s" %(number)
    run_command()

def main():
    print "yes"
    procs = []
    print multiprocessing.cpu_count()
    for i in range(0, 5, 1):
        process = multiprocessing.Process(target=msg, args=(i,))
        procs.append(process)
    for proc in procs:
        proc.start()
        psutil.Process(proc.pid).children()
    for proc in procs:
        proc.join()

if __name__ == "__main__":
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    相关资源
    最近更新 更多