day10-进程间数据交互

本文探讨了进程间通信的实现方式,对比了线程队列与进程队列的区别,并详细介绍了如何利用multiprocessing库中的Queue实现跨进程数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

  我们知道不同进程之间内存是不共享的,要想实现两个进程间的通信,咋办呢?我们用什么知识来解决呐?今天就来说说进程间的通信。

二、前戏

  之前我们说了queue,这个是线程queue,它的主要目的是两个线程之间的数据,一个是生产者,一个是消费者的模型,而且你必须是线程。只能在这个主线程内的其他线程访问,出了这个进程,你就不能被访问了。

2.1、进程访问queue

from multiprocessing import Process
import queue

def f(qq):
    qq.put([42, None, 'hello'])

if __name__ == '__main__':
    q = queue.Queue()   #把这个q传给了子进程
    p = Process(target=f, args=(q,))   #子进程访问父进程的q
    p.start()
    print(q.get())
    p.join()

很明显上面的代码报错,报错如下:

2.2、线程访问queue

import queue,threading

def f(qq):
    qq.put([42, None, 'hello'])

if __name__ == '__main__':
    q = queue.Queue()   #把这个q传给了子线程
    p = threading.Thread(target=f, args=(q,))   #子线程访问父线程的q
    p.start()
    print(q.get())
    p.join()

#输出
[42, None, 'hello']

很明显是可以的。由此得出,线程queue传给子进程是不可以的,你以为传给它了,其实传不了,如果你想传的话,必须是进程Queue。

三、进程间数据通信

3.1、Queue

说明:这个Queue是用于进程之间的数据通信,使用方法跟threading里的queue差不多。

from multiprocessing import Process,Queue   #导入进程和Queue

def f(qq):
    qq.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()   #把这个q传给了子进程
    p = Process(target=f, args=(q,))   #子进程访问父进程的q
    p.start()
    print(q.get())
    p.join()

#输出
[42, None, 'hello']

提问:父进程的q是怎么传给子进程的?

  父进程相当于克隆一个Q,把自己的Q克隆了一份交给子进程,子进程这个时候往Q里面放了一份数据,然后父进程又能实际的获取到。但是你克隆了一份是不是就和父进程没有关系了,为什么还能联系在一起呢?但是实际上:等于这两个Q里面的数据又把它序列化了,序列化到一个中间的地方,类似于翻译,然后反序列化给这个父进程这边来了,其实这两个Q就是通过pickle来序列化的,不是一个真正的Q。

小结:

  两个线程之间可以修改一个数据,不加锁,可能就会出错。现在进程中的Queue,是实现了数据的传递,不是在修改同一份数据,只是实现一个进程的数据传给了另外一个进程。

转载于:https://www.cnblogs.com/zhangqigao/articles/7301582.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值