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 ...
随机推荐
- tensorflow之最近邻算法实现
最近邻算法,最直接的理解就是,输入数据的特征与已有数据的特征一一进行比对,最靠近哪一个就将输入数据划分为那一个所属的类,当然,以此来统计k个最靠近特征中所属类别最多的类,那就变成了k近邻算法.本博客同 ...
- html标签title属性效果优化
html标签title属性效果不友好,最致命的是响应慢,体验不好,JQuery-UI提供了很好的支持.在jquery.tip的基础上又做了修改,这样子定制效果更强. 代码如下: <!DOCTYP ...
- 从认证到调度,K8s 集群上运行的小程序到底经历了什么?
导读:不知道大家有没有意识到一个现实:大部分时候,我们已经不像以前一样,通过命令行,或者可视窗口来使用一个系统了. 前言 现在我们上微博.或者网购,操作的其实不是眼前这台设备,而是一个又一个集群.通常 ...
- 实验吧web-易-what a fuck!这是什么鬼东西?
打开链接是一大串符号,是js编码的一种,全部复制下来,粘贴在控制台中回车就拿到flag了.
- jetty配置远程debug
1.配置远程jetty 服务器的 bin/jetty.sh JAVA_OPTIONS+=("-Xdebug -Xrunjdwp:server=y,transport=dt_socket,ad ...
- JavaWeb开发中遇到问题汇总
一.基础问题 1.${pageContext.request.contextPath}获取相对路径无效 问题:在jsp中使用${pageContext.request.contextPath}获取相对 ...
- idea 2018.3.4 破解
我的idea_home=C:\Program Files\\IntelliJ IDEA 2018.3.4\ 1.下载破解文件 链接:https://pan.baidu.com/s/1I2APmk-pj ...
- 多种类型SQL注入
前言 发现MYSQL手注注入方式用得多了,几乎都快忘记其它数据库注入的方式了,这里不讲绕过姿势和写shell,毕竟网上很多前辈都给了方法,我只讲一些基本的注入方式(只是记录一下各自的特性,记下来方便以 ...
- centos6.5源码升级内核
centos6.5源码升级内核 升级前 系统版本: CentOS5.5 内核版本: 2.6.18-194.el5 升级前做过简单配置文件修改 yum -y upgrade 升级后 系统版本: ...
- 吴裕雄--天生自然 JAVA开发学习:日期时间
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date ...