multiprocessing多进程间通信管道Pipe;通信接口Queue与pipe区别

参考:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017628290184064
https://docs.python.org/3/library/multiprocessing.html

****multiprocessing Process与Pool创建进程接口区别:
https://blog.csdn.net/Oops_newbie/article/details/80894654

****multiprocessing 多进程、多线程案例
https://blog.csdn.net/weixin_42357472/article/details/85052929

1、multiprocessing小知识

****multiprocessing.Queue与pipe两种通信接口区别:
https://zhuanlan.zhihu.com/p/24883194?from_voters_page=true

A Pipe() can only have two endpoints.

A Queue() can have multiple producers and consumers.
(1)Queue使用 putget维护队列 ,pipe使用 send recv维护队列 。

(2)pipe只提供两个端点,而Queue没有限制。

这意味着在使用Pipe时,只能同时启动两个进程。一个生产者和一个消费者在这两个端点上操作(由pipe()返回的两个值),这两个端点一起维护一个队列。如果多个进程同时在管道的同一个端点上操作,就会出现错误(因为没有锁,类似于线程不安全)。因此,两个端点相当于只为流程提供两个安全操作位置,从而将流程数量限制为只有2个。

(3)Queue的封装比较好,Queue只提供一个结果,可以被多个进程同时调用;Pipe()返回两个结果,分别由两个进程调用。

(4)Queue的实现基于pipe,所以pipe的运行速度比Queue快很多

(5)当只需要两个进程时,管道更快,当需要多个进程同时操作队列时,使用队列。
在这里插入图片描述

扫描二维码关注公众号,回复: 15866687 查看本文章

2、Pipe管道主进程要与子进程通信

1)创建子进程

# 在主进程创建管道
parentPipe2, childPipe2 = Pipe(True)
# 在主进程中创建子进程
proc2 = Process(target=run_asr_realtime, args=(childPipe2, ''))

# 启动子进程
proc2.start()

2)主进程要与子进程通信通过创建的管道进行信息通信

parentPipe2, childPipe2 = Pipe(True)

#childPipe2在子进程逻辑中往管道send内容

childPipe2.send(text)

#parentPipe2在主进程中从管道中recv内容
parentPipe2.recv()
from multiprocessing import Process, Pipe
import time

def run_asr_realtime(pipe, text):
    # 模拟实时语音转录逻辑
    # 这里只是一个示例,你需要根据实际情况替换为你的语音转录代码
    for i in range(5):
        time.sleep(1)
        text = f'转录的文本 {i+1}'
        pipe.send(text)

# 在主进程创建管道
parentPipe2, childPipe2 = Pipe(True)

# 在主进程中创建子进程
proc2 = Process(target=run_asr_realtime, args=(childPipe2, ''))

# 启动子进程
proc2.start()

# 在主进程的循环中不断获取转录的文本
while True:
    if parentPipe2.poll():
        text = parentPipe2.recv()
        print(f'从子进程接收到的文本: {text}')
    else:
        # 执行其他操作
        time.sleep(0.1)

    # 终止主进程的循环条件
    if text == '终止条件':
        break

# 等待子进程结束
proc2.join()

猜你喜欢

转载自blog.csdn.net/weixin_42357472/article/details/131473458