kaien_Q 2023-04-13 14:56 采纳率: 25%
浏览 15

管道通信在多进程的使用

下面是源代码,我想问下为什么管道通信不成功

import time
from multiprocessing import Process, Pipe
import threading

def f3(conn_1,conn_2):
    thread0 = threading.Thread(target=f, args=(conn_1,conn_2,))
    thread0.setDaemon(True)
    thread0.start()

def f(conn_1,conn_2):
    conn_2.close()
    conn_1.send(1)
    conn_1.close()

def f1(conn_1,conn_2):

    conn_1.close()
    print("Conn_2: ", conn_2.recv())
    conn_2.close()

if __name__ == '__main__':
    conn_1, conn_2 = Pipe()  # 生成管道的两边,分别传给两个进程
    p = Process(target=f3, args=(conn_1,conn_2))
    p.start()
    thread0 = threading.Thread(target=f1, args=(conn_1,conn_2,))
    thread0.setDaemon(True)
    thread0.start()

  • 写回答

1条回答 默认 最新

  • IT大鸵鸟 2023-04-13 15:06
    关注

    1、需要确保进程和线程都已经正确启动,才能进行进程间通信。可以使用join()方法阻塞当前线程,等待进程和线程完成执行。
    2、需要注意管道的方向,即数据的读取和写入方式。在这个例子中,你在f()函数中关闭了conn_2,但在f1()函数中尝试从conn_2接收数据,这可能会导致管道通信失败。

    import time
    from multiprocessing import Process, Pipe
    import threading
     
    def f3(conn_1, conn_2):
        thread0 = threading.Thread(target=f, args=(conn_1, conn_2,))
        thread0.setDaemon(True)
        thread0.start()
     
    def f(conn_1, conn_2):
        conn_2.close()
        conn_1.send(1)
        conn_1.close()
     
    def f1(conn_1, conn_2):
        conn_2.close()
        print("Conn_1: ", conn_1.recv())
        conn_1.close()
     
    if __name__ == '__main__':
        conn_1, conn_2 = Pipe()
        p = Process(target=f3, args=(conn_1, conn_2,))
        p.start()
        thread0 = threading.Thread(target=f1, args=(conn_1, conn_2,))
        thread0.setDaemon(True)
        thread0.start()
        p.join()
        thread0.join()
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 4月13日

悬赏问题

  • ¥15 报酬10000,做一个简单的换汇网站
  • ¥15 关于#vue.js#的问题:word excel和ppt预览问题语言-javascript)
  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢