Python在多处理中读取多个值
我一直在尝试构建一个简单的多处理程序,在特定时间捕获X的值,跳过不在读取时间内的值。 代码如下:Python在多处理中读取多个值,python,process,multiprocessing,Python,Process,Multiprocessing,我一直在尝试构建一个简单的多处理程序,在特定时间捕获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__ == '__m
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
但是,空闲时间给了我以下输出:
>>>
1
2
3
4
5
一直到20岁。
是否有清除缓冲区的命令?或者类似的事情
提前感谢。问题在于
recv()
获取管道中的下一个值,而不是最后一个值
因此,在4次迭代之后,f
将4个项目发送到管道中,因此管道如下所示:
1, 2, 3, 4
主进程将recv
1
:
2, 3, 4
再重复4次send
:
2, 3, 4, 5, 6, 7, 8
主进程recv
es2
。为了只接收最后一个,您需要首先清空管道:
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()
因此,我应该使用poll()清除管道。但这怎么可能呢?当poll()变为False时?我是说应该在20点结束,对吗?或者我在这里遗漏了什么?很明显,它是有效的,但我只是对它的工作原理感到困惑。感谢you@ajipoll
检查管道中是否还有可以接收的元素,因此您可以将其理解为有\u个元素。如果poll
变为false,则停止while循环。通过重复的recv
来清空管道。