前言:本博文是对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并发编程之进程(守护进程、锁、信号量)...相关推荐

  1. python的re2和re区别_浅谈Python中re.match()和re.search()的使用及区别

    1.re.match()fvk免费资源网 re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None.fvk免费资源网 包含的参数如下: ...

  2. python老是报参数未定义_浅谈Python程序的错误:变量未定义

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

  3. python 读excel字符型 数值_浅谈python 读excel数值为浮点型的问题

    浅谈python 读excel数值为浮点型的问题 如下所示: #读入no data = xlrd.open_workbook("no.xlsx") #打开excel table = ...

  4. python中的date的含义_浅谈python中的dateime

    原文链接:http://www.cnblogs.com/lhj588/archive/2012/04/23/2466653.html Python提供了多个内置模块用于操作日期时间,像calendar ...

  5. python在教育领域的应用_浅谈Python的主要应用领域

    Python的用途较为广泛,小编也会经常接触到各种与Python有关的项目,也算是一名忠实的开发者.能够遇到关于Python用途的问题,也很乐意回答.Python这个概念非常大,它的定位是" ...

  6. python中异或怎么算_浅谈Python逻辑运算符 异或xor

    我又来水文章了 这篇讲讲令人百思不得骑姐的异或运算 让我们先来看两段,不,是10(b)段对话:技术员:这个水坝系统的设计思路为按下紧急按钮或者水位高于危险水位时,系统发出警报 提问者:这个" ...

  7. python中for循环的用法_浅谈Python的for循环

    for循环在python中的重要性毋庸置疑,可是,我们真的把所有for循环的知识点都理解透了么?试试看以下内容: for 循环的基本格式 for iterable是可迭代对象,包括字符串,列表,元组, ...

  8. python全栈开发工程师招聘_浅谈Python全栈开发工程师,让程序员都眼红的职业!...

    若把学C/C++难度比作做冰箱设计师,那么Java就是公司做冰箱的工人,而Python就是使用冰箱的客户.这只是难度的比较,那么就有人要说Python肯定很弱了,是真的如此吗? 领域--------流 ...

  9. python能解决什么数据问题_浅谈Python数据分析

    Python数据分析最常用的包是numpy和pandas 下面我们先从一维数据开始了解两个包的运用:一维数据Numpy>>Arrary Pandas>>Series 一维数据分 ...

最新文章

  1. Nginx+Tomcat动静态资源分离
  2. vs azure web_在Azure中迁移和自动化Chrome Web爬网程序的指南。
  3. 【2016.11.16】HTML学习笔记
  4. 一个程序员的成长的六个阶段(转帖)
  5. 2048小游戏成品源码
  6. android studio 汉化包 美化包
  7. 什么是URL Rewrite?URL Rewrite有什么用?
  8. linux 进程死循环,排查程序死循环,死锁的方法 ——pstack
  9. zhu的Oracle数据库笔记
  10. java实现excel导入数据库
  11. Java课程学习四:编程题
  12. 3、git 暂存区撤销与删除
  13. segmentation fault(core dump);Run-Time Check Failure #3 -The variable 'p' is being used without bein
  14. win10计算机亮度无法调节,win10电脑调不了亮度怎么办?教你win10电脑调不了亮度处理方法...
  15. Cocoapods 黑魔法
  16. 【JZOJ B组】【NOIP2013模拟】小喵喵的新家
  17. 【Caffe笔记】二.Forward and Backward(前传/反传)
  18. 共轭方向法和共轭梯度法
  19. SQL借助于NewSQL开始回归
  20. 中国人工智能网http://www.chinaai.org/

热门文章

  1. Linux网络那点事
  2. 形象易懂讲解算法I——小波变换
  3. windows7 删除hiberfil.sys文件的方法
  4. java 顺序栈_Java实现顺序栈
  5. 海康+萤石云+云存储多少钱一个月_400万极清画质 萤石C6Wi智能家居摄像机
  6. linux 开源邮件 系统,4 个开源的命令行邮件客户端
  7. vue的html自动刷新,Vue页面刷新记住页面状态的实现
  8. element ui select设置不显示不存在的项_appium—等待时间设置方法
  9. bitcount方法详解_Java Long类的bitCount()方法和示例
  10. c#打印程序原码_C#程序打印新行