python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...
前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程、锁、信号量。
友情链接:
一、守护进程(daemon)
1.1 守护进程概念
首先我们都知道:正常情况下,主进程默认等待子进程调用结束之后再结束,守护进程在主进程所有代码执行完毕之后,自动终止。当然我们也可以使用kill -9 进程号,杀死进程。
那么接下来,我们看一下守护进程的语法:
进程对象.daemon = True
通过上面的代码,我们就可以设置该进程为守护进程。
注意: 必须要写在start()方法之前赋值。
此时,将设置为主进程守护,主进程如果代码执行结束了,该守护进程自动结束。
1.2 守护进程示例
from multiprocessing import Process
import time
def func():
print("子进程start")
time.sleep(1)
print("子进程end")
if __name__ == "__main__":
p = Process(target=func)
p.daemon = True
p.start()
time.sleep(1)
print("主进程执行结束")
因为为守护主进程,主进程结束子进程立即结束。
1.3 多个子进程的情况
当多个子进程并发执行时,默认主进程等待子进程,如果标记该子进程是守护进程,当主进程执行完毕所有代码之后,守护进程立刻终止。
主进程的代码执行到最后一行,就意味着函数代码执行完毕,此时就应该杀掉守护进程。其他非守护进程继续正常执行,主进程仍然等待直到结束,最后主进程在真正的释放结束。
from multiprocessing import Process
import time
def func1():
count = 1
while True:
print("*" * count)
time.sleep(0.5)
count +=1
def func2():
print("func2 start")
time.sleep(3)
print("func2 end")
if __name__ == "__main__":
p1 = Process(target=func1)
p1.daemon = True
p1.start()
p2 = Process(target=func2)
p2.start()
print("主进程代码执行结束...")
二、互斥锁(Lock)
上锁:lock.acquire()
解锁:lock.release()
2.1 互斥锁概念
同一时间允许一个进程上一把锁,就是Lock。那么我们加锁的意义在哪呢?加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改。虽然我们的程序运行速度是慢了,但牺牲速度却保证了数据安全。
同一时间允许多个进程上多把锁 就是[信号量Semaphore]。
信号量是锁的变形:实际实现是 计数器 + 锁,同时允许多个进程上锁。
2.2 互斥锁作用
互斥锁Lock:互斥锁就是进程的相互排斥。
谁先抢到自由,谁就上锁该资源内容,这样做可以保证数据的同步性。
注意:多个锁一起上,不开锁,会造成死锁,上锁和解锁是一对。
2.3 互斥锁示例
from multiprocessing import Process, Lock
# 创建一把锁
lock = Lock()
# 上锁
lock.acquire()
print(1)
# 解锁
lock.release()
# 死锁 : 只上锁,不解锁,会阻塞,产生死锁
lock.acquire()
print(2)
lock.release()
print(3)
lock.acquire()
print(4)
#lock.release():在这里我们不解锁
lock.acquire()
print(5)
注意:输出结果没有5,因为上一个锁,没有解锁,造成了死锁。
2.4 区分同步和异步
在产生进程对象的时候,进程之间是异步,上锁之后,进程之间变成同步。
from multiprocessing import Process,Lock
def func(num, lock):
lock.acquire()
print("走到上锁这个地方,变成一个同步程序,先来的进行先执行,后来的进程后执行,按次序依次执行")
print(num)
lock.release()
if __name__ == "__main__":
# lock互斥锁, 进程之间数据不共享
# 但是lock对象底层是通过socket来互相发送数据,不管多少进程,都是同一个lock锁
lock = Lock()
for i in range(3):
p = Process(target=func, args=(i, lock))
# 1. 10个子进程异步执行,是并发操作
p.start()
三、Semaphore(信号量)
信号量Semaphore是一个计数器,控制对公共资源或者临界区域的访问量,信号量可以指定同时访问资源或者进入临界区域的进程数。每次有一个进程获得信号量时,计数器-1,若计数器为0时,其他进程就停止访问信号量,一直阻塞直到其他进程释放信号量。
我们之前说到的Lock,属于互斥锁,也就是一把钥匙配备一把锁,同时只允许锁住某一个数据。而信号量则是多把钥匙配备多把锁,也就是说同时允许锁住多个数据。
from multiprocessing import Process,Semaphore
import random,time
def ktv(person,sem):
# 上锁
sem.acquire()
print("%s进入ktv唱歌" % (person))
time.sleep(random.randrange(3, 8))
print("%s走出ktv离开" % (person))
# 解锁
sem.release()
if __name__ == "__main__":
# 同一时间最多允许2个进程执行ktv任务,剩下的进程等待
sem = Semaphore(2)
for i in range(1, 6):
p = Process(target=ktv,args=("person%s" %i, sem))
p.start()
python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...相关推荐
- python的re2和re区别_浅谈Python中re.match()和re.search()的使用及区别
1.re.match()fvk免费资源网 re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None.fvk免费资源网 包含的参数如下: ...
- python老是报参数未定义_浅谈Python程序的错误:变量未定义
Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...
- python 读excel字符型 数值_浅谈python 读excel数值为浮点型的问题
浅谈python 读excel数值为浮点型的问题 如下所示: #读入no data = xlrd.open_workbook("no.xlsx") #打开excel table = ...
- python中的date的含义_浅谈python中的dateime
原文链接:http://www.cnblogs.com/lhj588/archive/2012/04/23/2466653.html Python提供了多个内置模块用于操作日期时间,像calendar ...
- python在教育领域的应用_浅谈Python的主要应用领域
Python的用途较为广泛,小编也会经常接触到各种与Python有关的项目,也算是一名忠实的开发者.能够遇到关于Python用途的问题,也很乐意回答.Python这个概念非常大,它的定位是" ...
- python中异或怎么算_浅谈Python逻辑运算符 异或xor
我又来水文章了 这篇讲讲令人百思不得骑姐的异或运算 让我们先来看两段,不,是10(b)段对话:技术员:这个水坝系统的设计思路为按下紧急按钮或者水位高于危险水位时,系统发出警报 提问者:这个" ...
- python中for循环的用法_浅谈Python的for循环
for循环在python中的重要性毋庸置疑,可是,我们真的把所有for循环的知识点都理解透了么?试试看以下内容: for 循环的基本格式 for iterable是可迭代对象,包括字符串,列表,元组, ...
- python全栈开发工程师招聘_浅谈Python全栈开发工程师,让程序员都眼红的职业!...
若把学C/C++难度比作做冰箱设计师,那么Java就是公司做冰箱的工人,而Python就是使用冰箱的客户.这只是难度的比较,那么就有人要说Python肯定很弱了,是真的如此吗? 领域--------流 ...
- python能解决什么数据问题_浅谈Python数据分析
Python数据分析最常用的包是numpy和pandas 下面我们先从一维数据开始了解两个包的运用:一维数据Numpy>>Arrary Pandas>>Series 一维数据分 ...
最新文章
- Nginx+Tomcat动静态资源分离
- vs azure web_在Azure中迁移和自动化Chrome Web爬网程序的指南。
- 【2016.11.16】HTML学习笔记
- 一个程序员的成长的六个阶段(转帖)
- 2048小游戏成品源码
- android studio 汉化包 美化包
- 什么是URL Rewrite?URL Rewrite有什么用?
- linux 进程死循环,排查程序死循环,死锁的方法 ——pstack
- zhu的Oracle数据库笔记
- java实现excel导入数据库
- Java课程学习四:编程题
- 3、git 暂存区撤销与删除
- segmentation fault(core dump);Run-Time Check Failure #3 -The variable 'p' is being used without bein
- win10计算机亮度无法调节,win10电脑调不了亮度怎么办?教你win10电脑调不了亮度处理方法...
- Cocoapods 黑魔法
- 【JZOJ B组】【NOIP2013模拟】小喵喵的新家
- 【Caffe笔记】二.Forward and Backward(前传/反传)
- 共轭方向法和共轭梯度法
- SQL借助于NewSQL开始回归
- 中国人工智能网http://www.chinaai.org/
热门文章
- Linux网络那点事
- 形象易懂讲解算法I——小波变换
- windows7 删除hiberfil.sys文件的方法
- java 顺序栈_Java实现顺序栈
- 海康+萤石云+云存储多少钱一个月_400万极清画质 萤石C6Wi智能家居摄像机
- linux 开源邮件 系统,4 个开源的命令行邮件客户端
- vue的html自动刷新,Vue页面刷新记住页面状态的实现
- element ui select设置不显示不存在的项_appium—等待时间设置方法
- bitcount方法详解_Java Long类的bitCount()方法和示例
- c#打印程序原码_C#程序打印新行