DAY 34 进程通信、消费者模型和线程
一.进程间通行
队列:先进先出
堆栈:先进后出
一般利用队列实现进程间的通信
from multiprocessing import Queueq = Queue(5) # 产生一个最多能够存放五个数据的队列 q.put(1) # 往队列中存放数据,# 如果存放的数据个数大于队列最大存储个数,程序会阻塞 print(q.full) # 判断队列是否饱和 q.get() # 取数据,get一次就取一个 q.get_nowait() # 在队列有数据的情况下,与get取值相同# 在队列没有数据的情况下,取值直接报错print(q.empty()) # 判断队列是否为空,在并发情况下,判断不准确print(q.get()) # 如果队列为空,get就会在原地等待队列中有数据过来
二.基于队列实现进程间通信
from multiprocessing import Queue, Processdef producer(q):q.put('hello world')def consumer(q):print(q.get())if __name__ =='__main__':q.Queue() # 生成一个队列对象p1 = Process(target=producer,args=(q,))c1 = Process(target=consumer,args=(q,))p1.start()c1.start()
三.生产者消费者模型
生产者消费者模型:
生产者: 生产数据的程序
消费者: 处理数据的程序
解决供需不平衡的问题
定义一个队列,用来存放固定数量的数据
解决一个生产者和消费者不需要直接交互,两者通过队列进行数据传输
Queue(队列) = 管道 + 锁
1.Queue方法
from multiprocessing import Process,Queue,JoinableQueue import time import randomdef produce(name,food,q):for i in range(5):data = '%s 做了 %s%s' % (name,food,i)time.sleep(random.randint(1,3))print(data)q.put(data) # 将生产的数据放入队列中def consumer(name,q):while True:data:str = q.get() if data is None:breaktime.sleep(random.randint(1,3))data = data.replace('了', '的')print('%s 吃了 %s' % (name, data))if __name__ == '__main__':q = Queue() # 生成一个队列对象p1 = Process(target=produce,args=('egon', '包子', q,))p2 = Process(target=produce,args=('tank', '小笼', q,))c1 = Process(target=consumer,args=('owen', q,))c2 = Process(target=consumer,args=('jason', q,))p1.start()p2.start()c1.start()c2.start()p1.join() # 等待生产者生产完所有的数据p2.join() # 等待生产者生产完所有的数据# 在生产者生产完数据之后,往队列里面放一个提示性的消息,告诉消费者已经没有数据,你走吧,不要等了 #q.put(None)#q.put(None)
2.JoinableQueue方法
from multiprocessing import Process, JoinableQueue import time import randomdef produce(name, food, q):for i in range(5):data = '%s 做了 %s%s' % (name, food, i)time.sleep(random.randint(1, 3))print(data)q.put(data) # 将生产的数据放入队列中def consumer(name, q):while True:data: str = q.get()if data is None: breaktime.sleep(random.randint(1, 3))data = data.replace('了', '的')print('%s 吃了 %s' % (name, data))q.task_done() # 告诉你的队列,你已经将数据取出并且处理完毕if __name__ == '__main__':q = JoinableQueue() # 生成一个队列对象p1 = Process(target=produce, args=('egon', '包子', q,))p2 = Process(target=produce, args=('tank', '小笼', q,))c1 = Process(target=consumer, args=('owen', q,))c2 = Process(target=consumer, args=('jason', q,))p1.start()p2.start()c1.daemon = Truec2.daemon = Truec1.start()c2.start()# 等待生产者生产完所有的数据 p1.join()p2.join()q.join() # 等待队列中数据全部取出
四.线程
1.什么是线程
进程:资源单位(只申请内存空间)
线程:执行单位(执行代码)
注意: 每一个进程中都会自带一个线程
2.为什么要有线程
开启一个进程:
申请内存空间 耗时
将代码拷贝到申请的内存空间中 耗时
开启一个线程
不需要申请内存空间 速度快
不需要拷贝代码 省时
总结:开线程的开销远远小于进程的开销!!!
五.开启线程的两种方式
1.Thread模块开始线程
from threading import Thread import timedef task(name):print('%s is running' % name)time.sleep(1)print('%s is running' % name)t = Thread(target=task,args=('egon',)) t.start() print('主')
2.自定义模块继承Thread模块开始线程
from threading import Thread import timeclass MyThread(Thread):def __init__(self,name):super().__init__() # 重写功能,以防父类功能缺少执行self.name = namedef run(self):print('%s is running' % self.name)time.sleep(1)print('%s is running' % self.name)t = MyThread('egon') t.start() print('主')
六.线程之间数据共享
join只能将整体进行串行,人为的规定顺序。
from threading import Threadx = 100def task():global xx = 1t = Thread(target=task) t.start() t.join() print(x)
七.线程互斥锁
互斥锁同一时间只有一个线程能运行,把并行变成串行,为了保证数据的安全性。从而降低了效率。
互斥锁可以将局部变成串行让大家公平的抢
from threading import Thread, Lock import timex = 100 mutex = Lock()def task():global xmutex.acquire()temp = xtime.sleep(0.1)x = temp - 1mutex.release()t_list = [] for i in range(100):t = Thread(target=task)t_list.append(t)t.start()for i in t_list:i.join()print(x)
八.线程对象其他属性和方法
from threading import Thread, active_count, current_thread import os, timedef task():print('%s is running' % current_thread().name,os.getpid())time.sleep(1)print('%s is done' % os.getpid())t = Thread(target=task) t.start() print(active_count()) print('主', os.getpid(),current_thread().name)
九.守护线程
大前提:一个任务守护另外一个任务代码的执行过程
在一个进程内只有一个线程的情况下,守护进程会在主进程代码执行完毕后立刻结束
在一个进程可以开启多个线程,守护的线程会在该进程内所有非守护线程都执行完之后才结束
from threading import Thread import timedef task():print('is running')time.sleep(2)print('is over')t = Thread(target=task) t.daemon = True t.start() print('主')
转载于:https://www.cnblogs.com/zhengyuli/p/10828141.html
DAY 34 进程通信、消费者模型和线程相关推荐
- Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)
条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...
- IPC生产者与消费者模型加线程
共享内存方式(IPC进程间通信) 一个进程在内存中就是对应着一块独立的内存空间 进程间通信的方式: 1.管道:只能单向通讯,数据都是二进制 2.文件:在硬盘上创建共享文件 优点:数据量无限制 缺点:传 ...
- python-生产者消费者模型_线程_线程互斥锁_GIL全局解释器锁
进程 1. 开启进程的两种方式 2. 进程对象其他属性和方法-pid: 进程id号 os.getpid()-ppid: 父进程id号 os.getppid() -is_alive(): 当前进程是否存 ...
- 并发编程——进程——生产者消费者模型
一.生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务. 在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者 ...
- 用java智能锁远程,从生产者-消费者模型了解线程、同步、锁(java)
代码主要包括4个类和1个测试类: 1.Egg 类: 鸡蛋,可以由生产者放入到篮子中,供消费者消费食用. 2.Blanket 类:一个篮子,最多能装5个鸡蛋. 3.Producer 类: 生产者(可以有 ...
- 线程通信和进程通信区别(线程进程区别)
前言: 腾讯笔试中多道选择题考到这个问题,这里总结一下.学习Java的童鞋可能对于线程的理解要比学php好很多.本文参考于线程通信与进程通信的区别 . 进程和线程的区别: 对于进程来说,子进程是父进程 ...
- 深入理解生产则消费者模型
文章目录 经典并发同步模式:生产者-消费者设计模式 什么是生产者-消费者模式 为什么要使用生产者消费者模式 生产者-消费者模式的特点 生产者-消费者模式的应用场景 生产者-消费者模式的优点 生产者-消 ...
- Linux---生产者与消费者模型
生产者与消费者模型也称为限缓冲问题,是线程同步问题的经典案例,生产者主要是放数据,消费者主要是读取数据 可能我们会想,你生产者就光负责存数据,我消费者就负责读数据,怎么会出现问题呢? 其实不是这样的, ...
- 再谈Android Binder跨进程通信原理
在谈Android的跨进程通信问题上时,总会问到Android的IPC机制,是指两个进程之间进行数据交换的过程.按操作系统的中的描述,线程是CPU调度最小的单元,同时线程是一种有限的系统资源,而进程是 ...
- Android跨进程通信Binder机制与AIDL实例
文章目录 进程通信 1.1 进程空间划分 1.2 跨进程通信IPC 1.3 Linux跨进程通信 1.4 Android进程通信 Binder跨进程通信 2.1 Binder简介 2.2 Binder ...
最新文章
- LeetCode简单题之位1的个数
- 那些有趣的Webview细节
- emacs vim IDE
- shell python比较_shell中的条件判断以及与python中的对比
- cad钣金展开插件_钣金折弯展开的计算方法汇总
- 判断数组是否有序排列的0831
- android handler的机制和原理_Android 插件化原理——Hook机制之AMSamp;PMS解析
- 远程安装CentOS
- staitc 变量以及成员
- php app 签名错误,微信小程序基于PHP微信支付“签名错误”填坑
- 用visio2003画简单流程图
- python评委打分代码_使用python实现男神女神颜值打分系统(推荐)
- 任玉刚【Android开发艺术探索】读后笔记三
- Spring Boot编程思想 核心篇 小马哥
- linux下gbd调试基础
- 一切前端概念,都是纸老虎(附送书的抽奖结果)
- 天津海洋功能区划获批复 排海污水须100%达标-天津海洋功能区划-污水-达标率
- 智能音箱场景下的性能优化
- 计算机组成原理(下)
- c++继承 基类 派生类 虚函数
热门文章
- 探索webpack热更新对代码打包结果的影响(二)
- SonicWALL防火墙初探
- UltraEdit 许可证ID 如何加密和解密文本教程分享
- idm下载百度网盘有限制 提示403错误 下载显示没有权限404,最新的解决办法教程
- 阿里面试官:为什么MySQL数据库索引选择使用B+树而不是跳表?
- 为了满足自己的好奇心,搞了一个业余项目耍,没想到还给我带来了$3000的收入......
- 记得收藏这12个爆款 Java 开源项目!【附源码】
- 从微服务跨越到中台,架构领域年度盘点!
- 深入浅出 CAS,很多想进阿里的倒在了这个知识点
- 关于Spring,所有的都在这了,具有收藏价值