Python在多处理中读取多个值

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

我一直在尝试构建一个简单的多处理程序,在特定时间捕获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
但是,空闲时间给了我以下输出:

>>>
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
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()

因此,我应该使用poll()清除管道。但这怎么可能呢?当poll()变为False时?我是说应该在20点结束,对吗?或者我在这里遗漏了什么?很明显,它是有效的,但我只是对它的工作原理感到困惑。感谢you@aji
poll
检查管道中是否还有可以接收的元素,因此您可以将其理解为
有\u个元素。如果
poll
变为false,则停止while循环。通过重复的
recv
来清空管道。