Python在多处理中读取多个值

标签 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__ == '__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

和主进程recves 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/

相关文章:

python - 更新 matplotlib 中的线条

python - 将 boto3 输出转换为方便的格式

python - 连续多处理

python - 如何在 fasta 文件中并行计算,其中每个处理器处理一个序列

python - Django - 在模板中显示数据

python - key 错误 : 'pop from an empty set' python

objective-c - 如何判断进程是否在用户界面进程中?

c - 为什么在管道的读取端关闭时不会发生 SIGPIPE?

process - 我如何确定团队中软件开发的改进领域?

multithreading - 多处理与扭曲