Python:有关子进程,管道数据和多处理的问题

时间:2011-06-29 22:41:08

标签: python subprocess pipe multiprocessing popen

我有一个Python程序,它使用Popen来调用测试C ++程序。测试C ++程序只是将0-99999写入stdout。 Python程序有两个应该作为单独进程运行的函数。一个函数funcA应该启动C ++程序,从stdout管道读取整数,并将这些整数插入到共享队列中。另一个函数funcB应该读取并打印队列中的整数,直到队列为空。我将在下面发布一些问题/问题,以及我下面的代码。

  1. funcA从C ++程序的stdout读取它直到它(C ++程序)终止的正确方法是什么?
  2. 在处理完所有整数之前,funcB从共享队列中读取的正确方法是什么?
  3. 我相信,我当前对问题1的方法有效,但我知道可能存在一些我不检查的问题,例如Queue填满。此外,所有数字都没有打印出来(停止在98000左右),我认为这可能与funcA终止和破坏共享队列有关?我不确定如何处理问题2,因为文档说在并发处理环境中不能依赖empty()而我不想使用while(1)。

    import multiprocessing
    import subprocess
    import Queue
    
    def funcA(intQueue):
        # call C++ program
        handle = subprocess.Popen(['../C++/C++.exe'], stdout=subprocess.PIPE)
    
        while(handle.returncode == None):
            handle.stdout.readline()
            intQueue.put(handle.stdout.readline())
            handle.poll()
    
    def funcB(intQueue):
        try:
            while(1):
                print intQueue.get(True, 2)
        except Queue.Empty:
            pass
    
    if __name__ == "__main__":
        # shared Queue for all the processes
        intQueue = multiprocessing.Queue()
    
        # producer - receives ints from the C++ stdout and inserts into Queue
        multiprocessing.Process(target=funcA, args=(intQueue,)).start()
    
        # consumer - prints ints from the Queue
        multiprocessing.Process(target=funcB, args=(intQueue,)).start()
    

2 个答案:

答案 0 :(得分:2)

使用Popen的{​​{3}}方法,如下所示:

handle = subprocess.Popen(['../C++/C++.exe'], stdout=subprocess.PIPE)
out, err = handle.communicate()    # this will block until the underlying subprocess exits

对于队列,数据结构定义了查询所述队列的方法(如果它已满或为空)。利用这些。

答案 1 :(得分:1)

如果有人遇到同样的问题:

对于问题1,我使用了一段时间(1),当从handle.stdout.read()的拆分返回的列表的长度为1时,它会中断(这意味着管道没有返回任何内容)。

对于问题2,我使用了这篇文章中描述的毒丸方法:http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html