Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >十、python学习笔记-进程-进程通信之Queue

十、python学习笔记-进程-进程通信之Queue

原创
作者头像
堕落飞鸟
发布于 2022-02-08 13:58:35
发布于 2022-02-08 13:58:35
28400
代码可运行
举报
文章被收录于专栏:飞鸟的专栏飞鸟的专栏
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 队列可以实现不同进程间的通信
"""关于队列
进程的队列和线程的队列并不是一个队列,他们的机制也是不一样的,实现的效果是类似的。
线程队列:from queue import Queue
进程队列:from multiprocessing import Process,Queue
队列默认为先进先出,先put进去的数据最先被get出来,
"""
from multiprocessing import Process, Queue

"""示例1、证明进程间的数据是不共享的
首先在主(父)进程中,定义了q = Queue()然后创建了3个子进程,调用函数Foo1(),
最后在执行命令时,发现报错“name 'q' is not defined”,说明在子进程中获取不到父进程数据“q = Queue()"""
def foo1():
    q.put('测试')


if __name__ == '__main__':
    q = Queue()         # 子进程获取不到该主进程定义
    p_list = []
    for i in range(3):
        p = Process(target=foo1)
        p_list.append(p)
        p.start()
    print(q.get())
    print(q.get())
    print(q.get())
    for i in p_list:
        i.join()


"""示例2、进程间数据是不能共享的,但是进程间可以通过队列(Queue)通信,将队列做为参数传递给函数
1、由于子进程中无法获取主(父)进程的q = Queue(),我们在创建子进程时将q作为参数传递,让子进程获取队列q = Queue()
这样就可以通过一个队列(q)实现进程间的通信(因为主(父)进程和子进程使用内容一样的队列)
2、每个进程往队列q中put一条数据,然后在get取出

注:下面的弄不清楚的可以跳过,因为是python自动做的没有什么纠结的必要
1、为了说明主(父)进程和子进程中的队列q的关系,我们打印q的内存位置
2、结果证明,主(父)进程和三个子进程的q并不是同一个队列q,说明子进程的队列q是拷贝的并不是共用的同一个队列q。
3、但是在最后从队列q取值时,使用的全部都是主(父)进程的队列,说明队列q在put时数据是单独的,但是在get时都是一个队列。
说明进程的队列,会自动将不同进程的队列信息传入到一个统一的队列(主进程的),用于调用,实现进程通过的队列的通信。
"""
def foo2(q, n):
    q.put(['子进程传入队列第{}数据'.format(n)])   # 在队列q中put数据,每个进程一次
    print("子进程中队列q的内存位置:", id(q))     # 打印每个进程队列的内存地址


if __name__ == '__main__':
    q = Queue()
    p_list = []
    q.put('主进程传入队列数据')
    print("主(父)进程中队列q的内存位置:", id(q))
    for i in range(1, 4):               # 循环创建3个进程,并启动
        p = Process(target=foo2, args=(q, i))
        p_list.append(p)
        p.start()
    print(q.get())                  # 逐条取出队列中的内容,并打印队列在内存中的地址(主进程一条,子进程3条)
    print(id(q))
    print(q.get())
    print(id(q))
    print(q.get())
    print(id(q))
    print(q.get())
    for i in p_list:
        i.join()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python之线程、进程
    从列表中取一个数据,相当于是复制了一份列表中的数据,列表中的元数据并没有被改动
py3study
2020/01/03
3990
十、python学习笔记-进程-进程的start和join
""" 1、进程的start方法执行进程。 2、join方法阻塞主进程,需要等待对应的子进程结束后再继续执行主进程。 3、多进程中必须使用join方法,避免出现僵尸进程 """ from multiprocessing import Process import time """ 1、定义函数Foo1,打印循环是第几环个进程。 2、我们在函数Foo1中增加不同的sleep时间来证明是多进程并发执行的(如果是并行会按照执行完成的先后顺序打印, 如果是串行会按照123的顺序打印) 3、创建空列表p_li
堕落飞鸟
2022/02/06
1K0
Python进程
Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进程并发程序。
py3study
2020/01/09
1K0
Python 多进程
#_*_coding:utf-8_*_ __author__ = 'jieli' import time import multiprocessing ''' 线程多锁是不需要当成参数传多,因为线程之间是共享内存多。 但是进程之间多锁是需要当成参数传的,因为进程之间的内存是独立的 多进程之间加锁是为了防止同时对一个文件做操作等等 ''' def run(num,l):     time.sleep(1)     #l.acquire()     print "hello, my name is:",n
py3study
2020/01/10
3210
python之多进程
python中的多线程无法利用多核优势,如果想要充分地使用多核cpu的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。python提供了multiprocessing
py3study
2020/01/19
9860
python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
基本方法:q.put(元素) q.get() q.get_nowait() q.full() q.empty()
suwanbin
2019/09/26
6280
python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
py基础---多线程、多进程、协程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程中并发执行不同的任务。
py3study
2020/01/16
7010
py基础---多线程、多进程、协程
python并发编程之多进程
 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。     multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
py3study
2020/01/19
3940
python并发编程之多进程
Python学习记录-多进程和多线程
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
py3study
2020/01/07
8260
十、python学习笔记-进程-进程通信之Manager
# 通过Manager创建线程间共享的字典,列表等 """Manager 使用Manger创建的字典,列表等在不同进程中是可以共享的 和Queue类似,需要将创建的实例以参数的形式传入子进程在进行调用 """ from multiprocessing import Process, Manager """ 1、Foo函数的形参d是Manager创建的字典,l是Manager创建的列表,n表示是第几个进程(for 循环创建) 2、对字典列表进行操作(赋值),如果该字典和列表是共享的,最后打印时,会打印每个
堕落飞鸟
2022/02/09
4130
Python学习(十)---- python中的进程与协程
原文地址: https://blog.csdn.net/fgf00/article/details/52790360 编辑:智能算法,欢迎关注! 上期我们一起学习了python中的线程的相关知识
智能算法
2018/10/08
5860
Python与线程
进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
星陨1357
2023/03/14
3750
Python与线程
Python之进程
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据
新人小试
2018/04/12
2.4K0
Python之进程
2.并发编程多编程
​ python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。 ​ multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
changxin7
2019/08/20
1.3K0
互斥锁和进程之间的通信
进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理。
全栈程序员站长
2022/07/21
6600
python进程vs线程
线程切换是有代价的,多任务一旦多到一个限度,就会消耗掉系统所有的资源,结果效率急剧下降,所有任务都做不好
测试加
2022/04/27
4390
浅谈互斥锁与进程间的通信 (举例说明)
进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理。注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全。
Java帮帮
2020/12/24
1.3K0
python多线程
1 多进程 # 多进程, import os import time from multiprocessing import Process # 启动时必须在 if __name__ 判断下,windows 必须,其他 无限制 # ================================================= # def func(args): # print("子进程:",os.getpid()) # print("子进程的父进程:",os.getppid()) #
Dean0731
2020/05/08
1.8K0
Python自学成才之路 进程间通信
程序在创建子进程时,会完全复制一份主进程的环境,包括变量,函数,类等。所以在子进程中使用的变量,函数,类和主进程之间隔离的,子进程之间也是隔离的。 看下面这个案例:
我是李超人
2020/09/07
4590
第36天并发编程之进程篇
步骤一:创建一个py程序,用来打印三个人的信息,创建了三个函数,每个函数里面都有一个sleep来模拟网络延迟,因此我们写出了下面的代码
py3study
2020/01/20
4310
相关推荐
python之线程、进程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档