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