Python高级(17)—进程间通信之管道

◎知识点

  1. 管道的概述

  2. 进程间通信之管道


◎脚本练习

▽ 管道的概述

"""
python中的管道有两种工作方式:
    (1) 单向(半双工)
        一端只能发送数据,另一端只能接收数据。
    (2) 双向(全双工)
        两端都既能发送数据又能接收数据,一端发送的数据只能由另一端接收。
        
    标准库模块multiprocessing中提供了一个函数Pipe(),其返回值是一个元组,元组中包含两个对象,
分别表示管道两端的连接。
    调用函数Pipe()时,如果不传入参数或传入的参数为True,管道的工作方式为双向(全双工);
    如果传入的参数为False,管道的工作方式为单向(半双工),其中,对于返回的元组,第一个连接对象只能接收
数据,第二个连接对象只能发送数据。

对于管道两端的连接对象,主要有两个方法:
    (1) send(self, obj)
        用于将参数obj指定的对象发送到管道。
    (2) recv(self)
        用于从管道中接收对象。
"""


from multiprocessing import Pipe

conn1, conn2 = Pipe()

conn1.send('conn1第1次发送的数据')
conn1.send('conn1第2次发送的数据')

conn2.send('conn2第1次发送的数据')
conn2.send('conn2第2次发送的数据')

print(conn1.recv()) # conn2第1次发送的数据
print(conn1.recv()) # conn2第2次发送的数据

print(conn2.recv()) # conn1第1次发送的数据
print(conn2.recv()) # conn1第2次发送的数据

c1, c2 = Pipe(False)

c2.send('c2发送的数据')
print(c1.recv())    # c2发送的数据

# c1.send('c1发送的数据')  # OSError: connection is read-only

Python高级(17)—进程间通信之管道


▽ 进程间通信之管道

"""
    如果想要实现进程之间的通信,管道是常见的实现方式之一。
"""


from multiprocessing import Process, Pipe
import os, time, random

# 发送数据的子进程执行的代码
def send_data(conn):
    print('发送数据的子进程%d启动' % os.getpid())

    for obj in list(range(1, 10)):
        print('发送数据:%s' % obj)
        conn.send(obj)
        time.sleep(random.random() * 3)

    print('发送数据:None')
    conn.send(None)

    print('发送数据的子进程%d结束' % os.getpid())

# 接收数据的子进程执行的代码
def recv_data(conn):
    print('接收数据的子进程%d启动' % os.getpid())

    while True:
        item = conn.recv()
        if item is None:
            print('接收数据:None')
            break
        print('接收数据:%s' % item)
        time.sleep(random.random() * 3)

    print('接收数据的子进程%d结束' % os.getpid())

if __name__ == '__main__':

    print('父进程%d启动' % os.getpid())

    cr, cs = Pipe(False)

    ps = Process(target=send_data, args=(cs, ))
    pr = Process(target=recv_data, args=(cr, ))

    ps.start()
    pr.start()

    ps.join()
    pr.join()

    print('父进程%d结束' % os.getpid())

Python高级(17)—进程间通信之管道


◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_senior/pipe.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5628.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注