PYTHON——多进程:进程间通信和数据共享

Posted 老π

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PYTHON——多进程:进程间通信和数据共享相关的知识,希望对你有一定的参考价值。

1、采用Queue队列通信

from multiprocessing import Process, Queue

def f(q,n):
    q.put([42, n, hello])

if __name__ == __main__:
    q = Queue()
    p_list=[]
    for i in range(3):
        p = Process(target=f, args=(q,i))
        p_list.append(p)
        p.start()
    print(q.get())
    print(q.get())
    print(q.get())
    for i in p_list:
        i.join()

2、采用Pipe管道通信

‘‘‘
由PIPER()返回的两个连接对象表示管道的两端。
每个连接对象都有SeNe()和ReCVE()方法(除其他之外)。
注意,如果两个进程(或线程)试图同时从管道的同一端读取或写入数据,
那么管道中的数据可能会损坏。
当然,在使用管道的不同端部的过程中不存在腐败风险。
‘‘‘
from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, hello]) #子进程发送
    conn.close()

if __name__ == __main__:
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())  # 主进程接收 prints "[42, None, ‘hello‘]"
    p.join()

3、采用Manager管理器对象通信

  Manager用于管理数据共享

‘‘‘
Manager()返回的管理器对象控制保存Python对象的服务器进程,
并允许其他进程使用代理操作它们。
Manager()返回的管理器将支持类型:list,dict, Namespace, Lock, RLock,
Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array
‘‘‘
from multiprocessing import Process, Manager

def f(d, l,n):
    d[n] = 1
    d[2] = 2
    d[0.25] = None
    l.append(n)
    print(l)

if __name__ == __main__:
    with Manager() as manager:  #with 类似 f = Open()格式
        d = manager.dict()
        l = manager.list(range(5))
        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l,i))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()

        print(d)
        print(l)

 












以上是关于PYTHON——多进程:进程间通信和数据共享的主要内容,如果未能解决你的问题,请参考以下文章

python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

进程间的通信-队列/管道以及进程间的数据共享和进程池

python之多线程

python多进程

[svc]共享内存

python并发编程之多进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型