进程间数据传递:Queue,Pipe 进程间数据共享:Manager

Posted staff

tags:

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

1.使用multiprocessing模块的Queue实现数据传递

‘‘‘
进程间通讯:
    Queue,用法跟线程里的Queue一样,put,get
    线程queue没有做序列化,进程queue做序列化了
    父进程的queue怎么传给子进程的?父进程的queue克隆了一份到子进程
    按理说两个queue没关系了。子进程向queue里放东西,queue序列化到一个中间地方
    父进程取就从中间地方反序列化,他们只是实现的数据的传递
‘‘‘
from multiprocessing import Queue,Process

def f(q):
    q.put("alex")

if __name__ == __main__:
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    p.join()
    print(q.get())  # alex

 

2.使用multiprocessing模块的Pipe实现数据传递

‘‘‘
进程间通讯:
管道,用法类似于socket
一次send对应一次recv,如果对应次数不对会出现阻塞
‘‘‘
from multiprocessing import Process
from multiprocessing import Pipe

def f(conn):
    conn.send([42,None,hello])
    print(conn.recv())
    conn.close()

if __name__ == __main__:
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    parent_conn.send(hello world)
    p.join()
‘‘‘
[42, None, ‘hello‘]
hello world
‘‘‘

 

3.使用multiprocessing模块的Manager实现数据共享

‘‘‘
两个进程怎么同时修改一份数据?
即数据的共享,需要用到manager
其实是copy了几份,再合并。
manager支持的类型有:
list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.
manager是自动加锁的
‘‘‘
from multiprocessing import Manager,Process
import os
def f(d, l):
    d[os.getpid()] = os.getpid()
    l.append(os.getpid())
    print(l)

if __name__ == __main__:
    with Manager() as manager:
        d = manager.dict() # 生成一个字典,可在多个进程间共享和传递
        l = manager.list(range(5)) # 列表...

        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()
        print(d)
        print(l)
‘‘‘
[0, 1, 2, 3, 4, 3088]
[0, 1, 2, 3, 4, 3088, 7092]
[0, 1, 2, 3, 4, 3088, 7092, 5256]
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460]
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460, 6696]
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460, 6696, 6796]
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460, 6696, 6796, 6640]
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460, 6696, 6796, 6640, 6296]
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460, 6696, 6796, 6640, 6296, 5308]
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460, 6696, 6796, 6640, 6296, 5308, 6704]
{3088: 3088, 7092: 7092, 5256: 5256, 6460: 6460, 6696: 6696, 6796: 6796, 6640: 6640, 6296: 6296, 5308: 5308, 6704: 6704}
[0, 1, 2, 3, 4, 3088, 7092, 5256, 6460, 6696, 6796, 6640, 6296, 5308, 6704]
‘‘‘

 

以上是关于进程间数据传递:Queue,Pipe 进程间数据共享:Manager的主要内容,如果未能解决你的问题,请参考以下文章

python进程间通信

python 学习笔记 - Queue & Pipes,进程间通讯

《Python》进程之间的通信(IPC)进程之间的数据共享进程池

Python多进程-进程间数据的传递

112 python程序中的进程操作-进程之间进行通信(mulitiProcessing Queue队列)

swoole进程间如何通信