进程间数据传递:queue,pipe进程间数据共享:manager(代码片段)

staff staff     2023-01-02     289

关键词:

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]
‘‘‘

 

多进程协程事件驱动及selectpollepoll

目录-多线程使用场景-多进程 --简单的一个多进程例子 --进程间数据的交互实现方法   ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享   ---Queues  ---Pipe  ---通过Manager可以不... 查看详情

进程间的通信-队列/管道以及进程间的数据共享和进程池(代码片段)

1.进程之间的通信  1)队列*****  2)管道***2 进程之间的数据共享*3 进程池*****   进程间通信IPC(Inter-ProcessCommunication)进程的概念:创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间... 查看详情

管道,进程间数据共享,进程池(代码片段)

...字符串不用bytes类型,直接是字符串类型。Pipe([duplex]):在进程之间创建一条管道,并返回元组(con 查看详情

ipc进程间通讯之二管道pipe

IPC进程间通信+管道Pipe         IPC(Inter-ProcessCommunication。进程间通信)。    管道用于进程间共享数据,事实上质是共享内存。经常使用IPC之中的一个。管道不仅能够用于本机进... 查看详情

进程间通讯机制

1.无名管道PIPE  作用:情缘关系进程间通信。  原理:是内核中一种特殊的临时文件,用完自动消失,数据采用循环队列的方式在进程间传递。2.有名管道FIFO  作用:任意进程间通信。  原理:是文件系统中特殊的永久... 查看详情

linux进程通信之匿名管道(代码片段)

进程间的通信方式  进程间的通信方式包括,管道、共享内存、信号、信号量、消息队列、套接字。进程间通信的目的  进程间通信的主要目的是:数据传输、数据共享、事件通知、资源共享、进程控制等。进程间通信之管... 查看详情

linuxprogram进程间通信:管道

系列文章:文件操作数据管理进程和信号POSIX线程进程间通信:管道信号量共享内存和消息队列套接字文章目录​​1.什么是管道​​​​2.进程管道​​​​2.1popen函数​​​​2.2pclose函数​​​​3.将输出送往popen​​​​3.1传... 查看详情

11.1进程间通信--共享内存(代码片段)

...享内存是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递不再涉及到内核,也就是说进程不再通过执行进入内核的系统调用来传递彼此的数据。写共享内存要加锁。常和信号量在一起使用... 查看详情

linux进程间通信(代码片段)

目录进程间通信介绍进程间通信的概念进程间通信目的进程间通信分类进程间通信的本质管道什么是管道匿名管道匿名管道的原理pipe函数pipe创建匿名管道实例管道读写规则管道的特性命名管道命名管道的原理创建一个命名管道... 查看详情

进程间通讯

1.不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用下面的方法。2.线程Queue,用于不同线程之间的互相访问,生产者消费者模型。3.进程Queue,4.主线程与子线程之间是可以互相访问内存的。主线程中生成了一... 查看详情

linux利用管道父子进程间传递数据

[原文] fork()函数:用于创建子进程,子进程完全复制父进程的资源,相当于父进程的拷贝。具体理解,运用父进程的同一套代码,通过判断进程ID来执行不同进程的不同任务。返回值正常为子进程ID,出错返回负值。pipe()函数... 查看详情

[转]windows下的进程间通讯及数据共享

...com/2005/10/interprocess_communications.htmlWindows下有很多方法实现进程间通讯,比如用socket,管道(Pipe),信箱(Mailslot),等等。但最基本最直接的还是使用内存共享。其他方法最终还是会绕道这里。可想而知,如果物理内存只有一份,让... 查看详情

linux-进程间通信(代码片段)

进程间通信进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道匿名管道匿名管道特点匿名管道读写规则命名管道创建一个命名管道命名管道的打开规则用命名管道实现server&client通信systemV共享内存共享内存共... 查看详情

linux-进程间通信(代码片段)

进程间通信进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道匿名管道匿名管道特点匿名管道读写规则命名管道创建一个命名管道命名管道的打开规则用命名管道实现server&client通信systemV共享内存共享内存共... 查看详情

多进程2

进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或打印同一个终端,是没有问题的加锁是将程序由并发转换为串行,牺牲运行效率,避免竞争加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可... 查看详情

进程间通信和线程间通信

进程通信管道(pipe)管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道(namedpipe)有名管道也是半双工的通信方式,但是它允许无亲缘关系... 查看详情

进程间通信(代码片段)

进程间通信进程间通信目的进程间通信发展进程间通信分类管道前言什么是管道?匿名管道匿名管道的特性命名管道命名管道的创建匿名管道与命名管道的区别命名管道的打开规则用命名管道实现server&client通信systemV共享... 查看详情

进程间通信(代码片段)

进程间通信进程间通信目的进程间通信发展进程间通信分类管道前言什么是管道?匿名管道匿名管道的特性命名管道命名管道的创建匿名管道与命名管道的区别命名管道的打开规则用命名管道实现server&client通信systemV共享... 查看详情