【发布时间】:2020-09-22 16:13:09
【问题描述】:
我想使用multiprocess 而不是subprocess.Popen 执行以下操作。这是因为我无法使用 popen 传递对象。我知道我下面的简单示例不使用/传递对象,但这就是我想要做的。
示例代码是:
main.py
import subprocess
class ProcReader():
def __init__(self, python_file):
self.proc = subprocess.Popen(['python', python_file], stdout=subprocess.PIPE)
def __iter__(self):
return self
def __next__(self):
while True:
line = self.proc.stdout.readline()
if not line:
raise StopIteration
return line
if __name__ == "__main__":
r1 = ProcReader("test1.py")
r2 = ProcReader("test2.py")
r3 = ProcReader("test3.py")
for l1, l2, l3 in zip(r1, r2, r3):
d1 = l1.decode('utf-8').strip().split(",")
d2 = l2.decode('utf-8').strip().split(",")
d3 = l3.decode('utf-8').strip().split(",")
print(f"{d1[0]}:{d1[1]},{d2[0]}:{d2[1]},{d3[1]}:{d3[1]}")
测试#.py
for x in range(10):
print("test1,{}".format(x))
我的示例代码在 python3 中,但我想要在 python2.7 中使用多进程的等效代码。等价物也应该从标准输出中读取吗?还是应该利用队列并让工作人员从队列中读取?
更新------
我使用多处理的示例:
import time
from multiprocessing import Process, Queue
def writer1(queue):
for x in range(10):
time.sleep(1)
queue.put("test1,{}".format(x))
def writer2(queue):
for x in range(10):
time.sleep(2)
queue.put("test2,{}".format(x))
def writer3(queue):
for x in range(10):
queue.put("test3,{}".format(x))
if __name__=='__main__':
q1 = Queue()
q2 = Queue()
q3 = Queue()
writer_1 = Process(target=writer1, args=((q1),))
writer_1.daemon = True
writer_1.start()
writer_2 = Process(target=writer2, args=((q2),))
writer_2.daemon = True
writer_2.start()
writer_3 = Process(target=writer3, args=((q3),))
writer_3.daemon = True
writer_3.start()
while True:
msg1 = q1.get()
msg2 = q2.get()
msg3 = q3.get()
if msg1 and msg2 and msg3:
d1 = msg1.strip().split(",")
d2 = msg2.strip().split(",")
d3 = msg3.strip().split(",")
print("{}:{},{}:{},{}:{}".format(d1[0],d1[1],
d2[0],d2[1],
d3[0],d3[1]))
else:
break
没有意识到q1.get() 等到有东西出现,我添加了sleep 来验证这一点。另外,我如何检查该过程是否已完成写入?看来只能等到最后了
【问题讨论】:
-
“我不能使用 popen 传递对象”——当然可以,你只需要在 stdin/stdout 上即兴创作一个序列化/消息传递方案。
-
@AKX 这很容易做到吗?使用多处理路线会更容易吗?
-
首先使用受支持的 Python 版本会更容易。但是到目前为止,您使用
multiprocessing尝试过什么? -
@AKX 仍在尝试让它与多处理一起工作,只是遇到了困难,所以这就是我在这里问的原因。必须跟踪队列中写入的进程
-
为什么不给每个进程自己的队列?
标签: python python-2.7 python-multiprocessing