一.进程间通行

  队列:先进先出

  堆栈:先进后出

  一般利用队列实现进程间的通信

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 进程通信、消费者模型和线程相关推荐

  1. Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)

    条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...

  2. IPC生产者与消费者模型加线程

    共享内存方式(IPC进程间通信) 一个进程在内存中就是对应着一块独立的内存空间 进程间通信的方式: 1.管道:只能单向通讯,数据都是二进制 2.文件:在硬盘上创建共享文件 优点:数据量无限制 缺点:传 ...

  3. python-生产者消费者模型_线程_线程互斥锁_GIL全局解释器锁

    进程 1. 开启进程的两种方式 2. 进程对象其他属性和方法-pid: 进程id号 os.getpid()-ppid: 父进程id号 os.getppid() -is_alive(): 当前进程是否存 ...

  4. 并发编程——进程——生产者消费者模型

    一.生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务. 在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者 ...

  5. 用java智能锁远程,从生产者-消费者模型了解线程、同步、锁(java)

    代码主要包括4个类和1个测试类: 1.Egg 类: 鸡蛋,可以由生产者放入到篮子中,供消费者消费食用. 2.Blanket 类:一个篮子,最多能装5个鸡蛋. 3.Producer 类: 生产者(可以有 ...

  6. 线程通信和进程通信区别(线程进程区别)

    前言: 腾讯笔试中多道选择题考到这个问题,这里总结一下.学习Java的童鞋可能对于线程的理解要比学php好很多.本文参考于线程通信与进程通信的区别 . 进程和线程的区别: 对于进程来说,子进程是父进程 ...

  7. 深入理解生产则消费者模型

    文章目录 经典并发同步模式:生产者-消费者设计模式 什么是生产者-消费者模式 为什么要使用生产者消费者模式 生产者-消费者模式的特点 生产者-消费者模式的应用场景 生产者-消费者模式的优点 生产者-消 ...

  8. Linux---生产者与消费者模型

    生产者与消费者模型也称为限缓冲问题,是线程同步问题的经典案例,生产者主要是放数据,消费者主要是读取数据 可能我们会想,你生产者就光负责存数据,我消费者就负责读数据,怎么会出现问题呢? 其实不是这样的, ...

  9. 再谈Android Binder跨进程通信原理

    在谈Android的跨进程通信问题上时,总会问到Android的IPC机制,是指两个进程之间进行数据交换的过程.按操作系统的中的描述,线程是CPU调度最小的单元,同时线程是一种有限的系统资源,而进程是 ...

  10. Android跨进程通信Binder机制与AIDL实例

    文章目录 进程通信 1.1 进程空间划分 1.2 跨进程通信IPC 1.3 Linux跨进程通信 1.4 Android进程通信 Binder跨进程通信 2.1 Binder简介 2.2 Binder ...

最新文章

  1. LeetCode简单题之位1的个数
  2. 那些有趣的Webview细节
  3. emacs vim IDE
  4. shell python比较_shell中的条件判断以及与python中的对比
  5. cad钣金展开插件_钣金折弯展开的计算方法汇总
  6. 判断数组是否有序排列的0831
  7. android handler的机制和原理_Android 插件化原理——Hook机制之AMSamp;PMS解析
  8. 远程安装CentOS
  9. staitc 变量以及成员
  10. php app 签名错误,微信小程序基于PHP微信支付“签名错误”填坑
  11. 用visio2003画简单流程图
  12. python评委打分代码_使用python实现男神女神颜值打分系统(推荐)
  13. 任玉刚【Android开发艺术探索】读后笔记三
  14. Spring Boot编程思想 核心篇 小马哥
  15. linux下gbd调试基础
  16. 一切前端概念,都是纸老虎(附送书的抽奖结果)
  17. 天津海洋功能区划获批复 排海污水须100%达标-天津海洋功能区划-污水-达标率
  18. 智能音箱场景下的性能优化
  19. 计算机组成原理(下)
  20. c++继承 基类 派生类 虚函数

热门文章

  1. 探索webpack热更新对代码打包结果的影响(二)
  2. SonicWALL防火墙初探
  3. UltraEdit 许可证ID 如何加密和解密文本教程分享
  4. idm下载百度网盘有限制 提示403错误 下载显示没有权限404,最新的解决办法教程
  5. 阿里面试官:为什么MySQL数据库索引选择使用B+树而不是跳表?
  6. 为了满足自己的好奇心,搞了一个业余项目耍,没想到还给我带来了$3000的收入......
  7. 记得收藏这12个爆款 Java 开源项目!【附源码】
  8. 从微服务跨越到中台,架构领域年度盘点!
  9. 深入浅出 CAS,很多想进阿里的倒在了这个知识点
  10. 关于Spring,所有的都在这了,具有收藏价值