day37-进程-锁和信号量
#1、锁:房间的门上有一把锁,锁上有一把钥匙,一个人使用这把钥匙开锁之后,带上钥匙进入房间,把门给反锁了,他在房间干活,
# 只要他不出来还锁,别人是无法进入房间的。同时只能有一个人在房间里干活。效率低,但能保证数据安全。
# 锁 在并发编程中保证数据安全。
#多进程实现并发:多进程就是同时开启多个进程,它们各干各活,从宏观上看跟并发编程是同一个意思。
from multiprocessing import Lock
lock = Lock() #创建锁,记住一把锁只有一把钥匙。
lock.acquire() #需要锁,拿到了钥匙
lock.acquire() #需要锁,但是锁被上面的人拿走了,等别人还锁,所以阻塞了。
lock.release() #释放锁,还钥匙 #2、抢票:
# json.load(f):load针对文件句柄,从文件中读取,将string转换为dict。
# json.dump(dict,f):将dict转换为string,写入到文件。
# ticket文件里的字典:{"count":3} ,"count"必须使用双引号,不能使用单引号。
from multiprocessing import Lock
from multiprocessing import Process
import json
def search(i): #搜索余票,json.load(f)是dict。
with open('ticket') as f:
print('客户%s'%i,'查到余票%s'%json.load(f)['count']) def get(i): #抢票,json.dump(dict,f)把dict转换为string写入到文件中。
with open('ticket') as f:
ticket_count = json.load(f)['count'] #先查出余票的数量。
if ticket_count > 0:
with open('ticket','w') as f :
json.dump({'count':ticket_count-1},f) #抢到票,余票的数量要减1。
print('客户%s抢到票了'%i)
else:
print('客户%s没抢到'%i) def task(i,lock): #调用任务task,就可以搜索余票和抢票。
search(i) #每个进程都可以搜索余票
lock.acquire() #只允许一个进程拿到钥匙,其他进程在等待。
get(i) #抢票
lock.release() #抢到票之后,还钥匙,这样其他进程才可以拿到钥匙。 if __name__ == '__main__':
lock = Lock() #创建锁。
for i in range(5): #有5个客户同时在抢票。
p = Process(target=task,args=(i,lock)) #5个客户相当于5个进程。
p.start()
# 客户1 查到余票3
# 客户0 查到余票3
# 客户1抢到票了
# 客户0抢到票了
# 客户3 查到余票1
# 客户3抢到票了
# 客户2 查到余票0
# 客户2没抢到
# 客户4 查到余票0
# 客户4没抢到 #3、信号量Semaphore:一把锁可以设置多把钥匙,例如设置3把钥匙,那么同时只能有三个人进入房间,其他人在等待,
# 当房间有人出来,其他人才可以进入。
#以迷你唱吧为例,每次只能进去两个人,其他人在外面等待,有人出来,其他人才能进去。
#信号量本质上就是锁,只不过在锁里面加上了计数器,acquire的时候钥匙的数量减1,release的时候钥匙的数量加1,
#当钥匙的数量为0的时候,其他进程只能等待了。
from multiprocessing import Semaphore
from multiprocessing import Process
import random
import time
def sing(i,sem):
sem.acquire() #拿到钥匙
print('%s进入房间唱K'%i)
time.sleep(random.randint(1,10)) #在房间逗留了1到10秒
print('%s出来了'%i)
sem.release() #还钥匙,有人还钥匙,其他人才能拿到钥匙进入房间。 if __name__ == '__main__':
sem = Semaphore(2) #信号量是2,也就是有两把钥匙,每次只能进去两个人,其他人在等待。
for i in range(5): #有5个人想唱K
p = Process(target=sing,args=(i,sem))
p.start()
# 1进入房间唱K
# 0进入房间唱K
# 1出来了
# 3进入房间唱K
# 0出来了
# 2进入房间唱K
# 3出来了
# 4进入房间唱K
# 2出来了
# 4出来了
day37-进程-锁和信号量的更多相关文章
- 13.1、多进程:进程锁Lock、信号量、事件
进程锁: 为什么要有进程锁:假如现在有一台打印机,qq要使用打印机,word文档也要使用打印机,如果没有使用进程锁,可能会导致一些问题,比如QQ的任务打印到一半,Word插进来,于是打印出来的结果是各 ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
- 人生苦短之我用Python篇(线程/进程、threading模块:全局解释器锁gil/信号量/Event、)
线程: 有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.是一串指令的集合.线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是 ...
- Python并发编程05 /死锁现象、递归锁、信号量、GIL锁、计算密集型/IO密集型效率验证、进程池/线程池
Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密集型效率验证.进程池/线程池 目录 Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密 ...
- 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)
知乎链接:https://zhuanlan.zhihu.com/p/57354304 1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可 ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
- python之网络编程--锁、信号量、线程、队列
一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...
- 进程锁,队列,JoinableQueue
内容梗概: 1.进程同步(锁) 2.队列(重点) 3.生产者消费者模式 4.JoinableQueue([maxsize]) 5.信号量(了解) 6.事件 1.进程同步(锁) 并发编程让我们能更加充分 ...
- linux自旋锁、互斥锁、信号量
为了避免并发,防止竞争.内核提供了一组同步方法来提供对共享数据的保护. 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别. Linux 使用的同步机制可以说从2.0到2 ...
随机推荐
- POJ 1651:Multiplication Puzzle 矩阵相乘式DP
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7118 Accepted: ...
- NiFi_Demo_调度示例
1.背景 要求:每天凌晨1:00后开始每2min执行一次sql查询 2.作业编排 3.各模块配置 3.1 GenerateFlowFile 作用:用于产生flowfile,该flowfile内容为空. ...
- 单细胞测序|单细胞基因组|单细胞转录组|Gene editing|
单细胞测序 单细胞基因组学 测量理由是单细胞的时间空间特异性. Gene expression&co-expression 比较正常cell与疾病cell,正常organ与疾病organ,看出 ...
- Pyspider的简单介绍和初使用
Pyspider Pyspider是由国人(binux)编写的强大的网络爬虫系统 Ptspider带有强大的WebUi / 脚本编辑器 / 任务监控器 / 项目管理器以及结果处理器.他支持多种数据 ...
- Spring Cloud Alibaba 教程 | Nacos(二)
源码解析客户端注册过程 nacos作为注册中心,包含了nacos服务端(注册中心服务)和nacos客户端,nacos注册中心服务上面一讲已经介绍过了它是一个用Java语言编写开源web项目,并且拥有自 ...
- 中小规模集群----Centos6部署wordpress及java程序
1 概述 1.1 业务需求 公司共有两个业务,网上图书馆和一个电商网站.现要求运维设计一个安全架构,本着高可用.廉价的原则. 具体情况如下: 网上图书馆是基于jsp开发: 电商系统是基于 ...
- Python KNN 学习曲线
学习曲线的目的是选择更好的模型参数.以最近邻算法为例,选取最近的多少个数据点,才能达到最优.可以控制训练集不动,调整最近的点的个数,绘制学习曲线. import matplotlib.pyplot a ...
- 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对
1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...
- 数组,字符串方法总结 Unicode 数字
String.prototype.charCodeAt(index) 就是返回字符串中下标单个数值 对应的编码表的10进制表示数值 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码 ...
- placeholder在IE下的兼容问题
最近写项目要求兼容到ie8,写完了去ie测试的时候,发现了placeholder在ie下的兼容问题,为了解决,搜罗网上各种牛人的解决方案,自己总结如下: css样式(设置各浏览器下placeholde ...