我一直在尝试构建一个简单的多处理程序,在特定时间捕获 X 的值,跳过不在读取时间的值。 这是代码:
from multiprocessing import Process, Pipe
from time import sleep
def f(conn):
x=0
for i in xrange(0,20):
x+=1
sleep(0.1)
conn.send(x)
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
for i in xrange(0,5):
print parent_conn.recv()
sleep(0.4)
p.join()
粗略地说,我对上面代码的期望是:
>>>
4
8
16
20
但是 IDLE 给了我这个输出:
>>>
1
2
3
4
5
依此类推,直到达到 20。 有没有清除缓冲区的命令?或类似的事情?
提前谢谢您。
最佳答案
问题是 recv()
获取管道中的下一个值,而不是最后一个值。
因此,经过 4 次迭代后,f
将 4 个项目发送
到 pipe
中,因此管道如下所示:
1, 2, 3, 4
主进程将recv
1
:
2, 3, 4
再进行 4 次 send
迭代后:
2, 3, 4, 5, 6, 7, 8
和主进程recv
es 2
。为了只接收最后一个,您需要先清空管道:
from multiprocessing import Process, Pipe
from time import sleep
def f(conn):
x=0
for i in xrange(0,20):
x+=1
sleep(0.1)
conn.send(x)
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
for i in xrange(0,5):
sleep(0.4)
# `recv` all values, keep only the last one
last = None
while parent_conn.poll():
last = parent_conn.recv()
print(last)
p.join()
关于Python在多处理中读取多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42039614/