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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

csharp: Flash Player play *.flv file in winform

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; using AxShockwaveFlashObjects;/** VS2005在添加Shockwave时…

ad文件服务器部署,AD 集成 – 配置 ADFS 登陆 - Seafile 服务器用户手册

要求要想使用 ADFS 登陆到 Seafile,需要以下组件:1、安装了 ADFS 的windows服务器。安装 ADFS 和相关配置详情请参考 本文。2、对于 ADFS 服务器的SSL有效证书,在这里我们使用 adfs-server.adfs.com 作为域名示例。3、对于 seafile 服务器的S…

win7映射网络驱动器消失了_win7怎么映射网络驱动器|win7设置网络驱动器的方法...

2015-08-21 15:57:15近来,有一些刚刚升级windows10系统的用户向小编咨询在新系统中该如何创建映射网络驱动器。其实,方法非常简单,接下来,小编就向大家分享win10系统创建映射网络驱动器的具体方法...2015-05-15 19:27:26Win7系统怎…

NTC热敏电阻基础以及应用和选择(转)

源:NTC热敏电阻基础以及应用和选择 NTC被称为负温度系数热敏电阻,是由Mn-Co-Ni的氧化物充分混合后烧结而成的陶瓷材料制备而来,它在实现小型化的同时,还具有电阻值-温度特性波动小、对各种温度变化响应快的特点,可被用…

graphic头文件函数_graphics.h头文件

graphics.h头文件是一款tc操作必备组件。graphics.h头文件主要是运行在win8、win7操作系统上,为用户提供了非常多函数类型,用户只需使用tc编译就可以使用这个软件,是用户进行tc编辑时不可缺少的操作工具。graphics.h头文件函数范围&#xff1…

homeomorphic 同胚 释义

简介 在拓扑学中,两个流形,如果可以通过弯曲、延展、剪切(只要最终完全沿着当初剪开的缝隙再重新粘贴起来)等操作把其中一个变为另一个,则认为两者是同胚的。如:圆和正方形是同胚的,而球面和环面就不是同胚的。 参考链…

流形 非流形 释义

非流形边 A non-manifold edge has more than two incident triangles. 就是一个边由超过两个三角形相交。就是非流形边。 非流形顶点 比如两个三棱锥相接触的那个顶点就是非流形顶点。 以此可以逆推出流形是什么意思。 参考 书籍 [Polygon mesh processing] 转载于:https://ww…

mysql 插入数据 自增长_如何在MYSQL插数据 ID自增

2种解决办法1.修改你的数据库表,将ID设为自增长,注:只有主键才可以设置为自增长例:CREATE TABLE message (id INT(8) NOT NULL AUTO_INCREMENT, PRIMARY KEY(id));2.代码中进行处理Statement ps;ResultSet rs;int id 0;........…

MSN无法登陆,服务暂时不可用(错误码:80048051)

好几次MSN突然就登陆不了,一次是改了系统时间,这个好办,你改成当前日期时间即可; 还有一个可能就是脱机工作: 請依照以下步驟進行除錯: 1. 關閉Windows Live Messenger 先關閉你的MSN,在右下角找…

drawboard pdf拆分文件_请收藏!这是一份最全的PDF问题解决方案。

晚上好呀,我是大梦。最近因为赶书稿和论文缘故,时常要翻看许多PDF文件,复制摘录写东西,忽然发现好不方便,从PDF复制过来的文字到Word中变成了乱码?一些扫描版PDF根本无法复制而且还留有许多白边&#xff0c…

Java基础教程——线程通信

线程通信:等待、唤醒 Object方法这些方法在拥有资源时才能调用notify唤醒某个线程。唤醒后不是立马执行,而是等CPU分配wait等待,释放锁,不占用CPU资源notifyAll唤醒全部等待的线程重点:资源的有效利用 生产一个&#x…

python requests cookies请求_python+requests实现接口测试 - cookies的使用

在很多时候,发送请求后,服务端会对发送请求方进行身份识别,如果请求中缺少识别信息或存在错误的识别信息,会造成识别失败。 如一些需要用户登录以后才能访问的页面。import requestsmyaddress_urlhttp://xxx.com/api/v1/myaddress…

kafka命令及启动

默认内网访问,要在外网访问的话,需要在修改config/server.properties中的配置 将listeners和advertised.listeners的值用主机名进行替换,在外用使用java进行生产者或消费者连接的时候,不填写具体的IP,填写安装kafka的主…

编程判断元素归类_编程练习-判断是否为易混淆数

题目来源:LeetCode给定一个数字 N,当它满足以下条件的时候返回 true:把原数字旋转180以后得到新的数字。如 0, 1, 6, 8, 9 旋转 180 以后,得到了新的数字 0, 1, 9, 8, 6 。2, 3, 4, 5, 7 旋转 180 后,得到的不是数字。易混淆数字 …

vue引入51la流量监控

main.js router.afterEach( ( to, from, next ) > {setTimeout(()>{var _hmt _hmt || [];(function() {//每次执行前,先移除上次插入的代码document.getElementById(51_la) && document.getElementById(51_la).remove();var hm document.createEle…

斯蒂夫乔布斯传 读后感

斯蒂夫乔布斯传 读后感 失败和命运,成长和感受刺激着乔布斯成长。他和普通人一样。但是,不一样的环境,不一样的职位,不一样的体验给了他不一样的生命。所以,慢慢成长吧。当你的经历足够支撑你的命运时,你会站到你想要的…

cad画直角命令_炸了,CAD fro命令配合tk命令,极轴追踪无敌!

文尾左下角阅读原文看视频教程好课推荐:零基础CAD:点我CAD室内:点我 周站长CAD:点我CAD机械:点我 Bim教程:点我CAD建筑:点我CAD三维:点我全屋定制:点我 ps教程&#xff1…

linux frp 内网穿透 nginx反向代理

wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_amd64.tar.gz frps.ini 服务端 有外网IP服务器 frpc.ini 客户端 局域网服务器 服务端: vi frps.ini [common] bind_port 8700 token asdasdasdasdasdasdasd vi start_frp_server.s…

[转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?

转载链接:https://www.zhihu.com/question/51325408/answer/125426642来源:知乎 这个问题无外乎有三个难点: 什么是sum什么是reduce什么是维度(indices, 现在均改为了axis和numpy等包一致)sum很简单,就是求和,那么问题…

多多进宝推广团队_多多进宝推广形式及推手寻找、佣金结算方式是怎样的?

多多进宝是拼多多下的一款推广工具,主要是针对于想要提高自己店铺产品的销量以及获取更多流量的拼多多商家来展开的!但是,目前为止还有很多拼多多商家对多多进宝的一个运用不太了解,以至于有一些拼多多商家在使用多多进宝时有很大…