一. 守护进程

守护进程: 主进程的代码运行结束,守护进程也跟着结束

1 主进程创建守护进程2 其一:守护进程会在主进程代码执行结束后就终止3 其二: 守护进程内无法才开启子进程, 否则抛出异常:4 AssertionError: daemonic processes are notallowed to have children5 注意: 进程之间是相互独立的, 主进程代码运行结束,守护进程随机终止

View Code

代码如下:

from multiprocessing importProcessimporttimedeffun():

time.sleep(2)print('子进程打印不出来')if __name__ == '__main__':

p= Process(target=fun )

p.daemon= True #守护进程

p.start()print('结束')

二. 进程同步

1. 同步锁(互斥锁) ***************

保证数据安全用的,但是将锁起来的那段代码的执行变成了同步\串行,

牺牲了效率,保证了安全

from  multiprocessing  import  Lock

l = Lock()

l.acquire() #锁住

数据操作

l.release() #释放

#由并发变成了串行,牺牲了运行效率,但避免了竞争

from multiprocessing importProcess,Lockimportos,timedefwork(n,lock):#加锁,保证每次只有一个进程在执行锁里面的程序,这一段程序对于所有写上这个锁的进程,大家都变成了串行

lock.acquire()print('%s: %s is running' %(n,os.getpid()))

time.sleep(1)print('%s:%s is done' %(n,os.getpid()))#解锁,解锁之后其他进程才能去执行自己的程序

lock.release()if __name__ == '__main__':

lock=Lock()for i in range(5):

p=Process(target=work,args=(i,lock))

p.start()

2. 信号量

Semaphore 内部维护了一个计数器, acquire-1,release + 1, 当计数器为0的时候

,阻塞其他的进程

1 互斥锁同时只允许一个线程更改数据,而信号量Semaphore是同时允许一定数量的线程更改数据 。2 假设商场里有4个迷你唱吧,所以同时可以进去4个人,如果来了第五个人就要在外面等待,等到有人出来才能再进去玩。3 实现:4 信号量同步基于内部计数器,每调用一次acquire(),计数器减1;每调用一次release(),计数器加1.当计数器为0时,acquire()调用被阻塞。这是迪科斯彻(Dijkstra)信号量概念P()和V()的Python实现。信号量同步机制适用于访问像服务器这样的有限资源。5 信号量与进程池的概念很像,但是要区分开,信号量涉及到加锁的概念

信号量

1 #semaphre 信号量 锁 原理跟锁差不多,但可以限制数量

2 importtime3 from multiprocessing importSemaphore,Process4

5 deffun(n,l):6 l.acquire()7 print('%s开始' %n)8 time.sleep(1)9 print('%s结束>>>' %n)10 time.sleep(1)11 l.release()12 if __name__ == '__main__':13 l = Semaphore(4)14 for i in range(10):15 p = Process(target=fun,args=(i,l))16 p.start()

View Code

3. 事件

e = Even(), 事件初始状态为False, 当事件为False,e.wait()的地方会阻塞,e.set()

将e 的状态改为

True,如果e的状态为True,wait的地方就不等待了,不阻塞了,

e.clear() 将e的状态改为False,

查看e的状态: is_set,

1 #Event 事件

2

3 #from multiprocessing import Event

4 # 5 #e = Event() #有两个状态 默认TURE wait Fase

6 #print(1)

7 #print(e.is_set()) #查看当前状态

8 #e.set() #设置状态为TURE

9 #print(e.is_set())

10 #e.clear() #清空状态, False

11 #print(e.is_set())

12 #13 #e.wait() #状态为False 就会被阻塞

14 #print('结束')

三. 进程通信(IPC)

队列 **************

队列: 进程安全的,能够保证数据安全,

Q = queue(4), 给队列设定一个固定的长度, q.put(),

q.get(),q.get_nowait(),q.get(False),

Q.put() 在队列满了的时候会阻塞和q.get在队列空了之后会阻塞

Q.put_nowait()

Q.full q.empty

#from multiprocessing import Queue#q = Queue(3)#q.put('灰机1号')#q.put('2')#q.put(3)#print(q.empty()) #判断是否为空#print(q.qsize()) #返回多少个数量#print(q.get())#print(q.get())#print(q.get())## print(q.get()) # q为空时将会被阻塞*******

#print(q.full()) #判断q已满#print(q.get_nowait()) ##print(q.get_nowait()) ##print(q.get_nowait()) #

## print(q.get_nowait()) # q为空时报错 queue.Empty*******#q.get(False) #同上 会报错

1 #基于队列的进程通信

2 #from multiprocessing import Process,Queue

3 #def fun(q):

4 #a = q.get()

5 #print('>>>>:', a)

6 #if __name__ == '__main__':

7 #q = Queue(9)

8 #q.put('奥术大师多')

9 #p = Process(target=fun,args=(q,))

10 #p.start()

11 #12 #print('主进程结束')

基于队列的通信

#Queue#import time#from multiprocessing import Process,Queue#

#def shengchan(q):#for i in range(10):#time.sleep(1)#q.put('包子%s号' %i)#print('包子%s号生产完毕' %i)#q.put(None)#def xiaofei(q):#while 1:#time.sleep(1.5)#a = q.get()#if a == None:#break#print('%s被吃' %a)#

#if __name__ == '__main__':#q = Queue(10)#p1 = Process(target=shengchan,args=(q,))#p2 = Process(target=xiaofei,args=(q,))#p1.start()#p2.start()#print('结束')

生产者消费者模型

生产者消费者模型

缓冲区解耦的事情

Joinablequeue, 能记录着你往队列里面put的数据量

其他方法和queue 是一样的,比queue多了两个方法: q.task_done,q.join

1 #JoinableQueue

2 #import time

3 #from multiprocessing import Process,JoinableQueue

4 #5 #def shengchan(q):

6 #for i in range(10):

7 #time.sleep(1)

8 #q.put('包子%s号' %i)

9 #print('包子%s号生产完毕' %i)

10 #q.join()

11 #def xiaofei(q):

12 #while 1:

13 #time.sleep(1.5)

14 #a = q.get()

15 #print('%s被 吃' %a)

16 #q.task_done()

17 #18 #if __name__ == '__main__':

19 #q = JoinableQueue(10)

20 #p1 = Process(target=shengchan,args=(q,))

21 #p2 = Process(target=xiaofei,args=(q,))

22 #p2.daemon = True

23 #p1.start()

24 #p2.start()

25 #print('结束')

JoinableQueue队列应用

python 队列 锁_python-day31(同步锁,队列)相关推荐

  1. 001@多用派发队列,少用同步锁

    多用派发队列,少用同步锁 <Effective Objective-C>中第41条: 多用派发队列,少用同步锁.多个线程执行同一份代码时,很可能会造成数据不同步,这是推荐采用GCD来为代码 ...

  2. python停车场_python 多线程同步锁之实现停车场业务 (1)

    好久没用Python,最近复习了一下,写一个停车场的实现 ,代码如下,所有的需求实现都在注释中 ** show code** #!/usr/bin/env python # ╭╮__╭╭╭╭╭__╭╮ ...

  3. python 进程间通信效率_Python进程间通信 multiProcessing Queue队列实现详解

    一.进程间通信 IPC(Inter-Process Communication) IPC机制:实现进程之间通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁的概念--->queue 二 ...

  4. python 线程锁_Python多线程-线程锁

    多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...

  5. Syschronized同步锁和lock同步锁的区别

    Syschronized和lock的区别 1.Lock是显式锁(手动开启和关闭锁,别忘记关闭锁), synchronized是隐式锁,出了作用域自动释放 2,Lock只有代码块锁,synchroniz ...

  6. python优先级排序_Python实现一个优先级队列的方法

    问题 怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素 解决方案 下面的类利用 heapq 模块实现了一个简单的优先级队列: import heapq ...

  7. python 全局解释器锁_python全局解释器锁(GIL)

    什么是全局解释器锁GIL 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译 ...

  8. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  9. python多线程锁_Python多线程互斥锁使用

    # 代码 # coding=utf-8 """通过使用互斥锁,锁定全局变量,防止数据异常""" import threading num = ...

  10. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)

    文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...

最新文章

  1. OpenCV编译viz模块
  2. 姿态估计算法汇总|基于RGB、RGB-D以及点云数据
  3. cocos2d-x 从onEnter、onExit、 引用计数 谈内存泄露问题
  4. flask 返回html json 并让ios 安卓接收
  5. linux定时任务的设置
  6. HTML5与HTML4的区别
  7. runtimeexception异常_应用系统的异常管理-持续更新
  8. VTK:模型之DelaunayMesh
  9. 【编程导航】这本小书,把常考算法题讲活了!
  10. 在新窗口中打开链接 javascript
  11. iOS 进阶 第二十二天(0603)
  12. Annotation-specified bean name ‘mapper‘ for bean class [com.thoughtworks.xstream.mapper.Mapper] conf
  13. 指标公式c语言源码下载,通达信超级厉害指标公式源码附图-通达信公式-公式指标网...
  14. 桌面高效便捷的多窗口调整管理工具
  15. 如何通过Excel文件批量生成PDF417二维码
  16. 改善客户服务体验的 5 种方法
  17. CRM管理系统查询客户信息
  18. 城乡规划编制单位资质开通申请
  19. easy-mock 官网,最新网址!
  20. Amazon EKS基于GitLab的CICD实践二 基础架构和应用架构创建篇

热门文章

  1. 控制电脑_用小程序远程控制电脑
  2. java中集合的区别_Java中的集合与集合之间的区别
  3. 难点—在引用数组元素时指针的运算
  4. CRC32碰撞解密压缩包密码的脚本
  5. python基础教程:global的用法
  6. python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
  7. Python urllib与requests、XML和HTMLParser
  8. linux7下安装git,centos7下安装配置git仓库
  9. ubuntu无法安装vscode(visual studio code)如何卸载snap?
  10. 【放置奇兵】英雄各属性介绍