#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-进程-锁和信号量的更多相关文章

  1. 13.1、多进程:进程锁Lock、信号量、事件

    进程锁: 为什么要有进程锁:假如现在有一台打印机,qq要使用打印机,word文档也要使用打印机,如果没有使用进程锁,可能会导致一些问题,比如QQ的任务打印到一半,Word插进来,于是打印出来的结果是各 ...

  2. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  3. day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,

    六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...

  4. 人生苦短之我用Python篇(线程/进程、threading模块:全局解释器锁gil/信号量/Event、)

    线程: 有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.是一串指令的集合.线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是 ...

  5. Python并发编程05 /死锁现象、递归锁、信号量、GIL锁、计算密集型/IO密集型效率验证、进程池/线程池

    Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密集型效率验证.进程池/线程池 目录 Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密 ...

  6. 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)

    知乎链接:https://zhuanlan.zhihu.com/p/57354304 1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可 ...

  7. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  8. python之网络编程--锁、信号量、线程、队列

    一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...

  9. 进程锁,队列,JoinableQueue

    内容梗概: 1.进程同步(锁) 2.队列(重点) 3.生产者消费者模式 4.JoinableQueue([maxsize]) 5.信号量(了解) 6.事件 1.进程同步(锁) 并发编程让我们能更加充分 ...

  10. linux自旋锁、互斥锁、信号量

    为了避免并发,防止竞争.内核提供了一组同步方法来提供对共享数据的保护. 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别. Linux 使用的同步机制可以说从2.0到2 ...

随机推荐

  1. SpringBootStarter种类

    Name Description spring-boot-starter 核心starter, 包括auto-configuration支持, logging和YAML 支持 spring-boot- ...

  2. 19 01 12 javascript 定时器 封闭函数

    定时器 定时器在javascript中的作用1.制作动画2.异步操作3.函数缓冲与节流 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行一次的定时器 setIn ...

  3. HTML5新标签使用及CSS选择器(伪类)

    这些标签能够让搜索引擎更直接的解析页面内容. <header></header>语义:文档或者页面的头部 <nav></nav>语义:导航这两者不是组合 ...

  4. [mysql8 报错] 关闭ONLY_FULL_GROUP_BY

    bug原因: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中.简而言之,就是SELECT后面接的列必须 ...

  5. 寒假day08

    今天爬了部分与人才动态相关的数据,还刷了剑指offer的部分算法题

  6. Java--二维码生成&图片和流转化

    package test; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java. ...

  7. Json返回结果为null属性不显示解决

    import java.io.IOException; import org.springframework.boot.autoconfigure.condition.ConditionalOnMis ...

  8. LeetCode——48. 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  9. Java static特性

    static 表示是静态的 特点是:可以用类直接访问. 属于类, 在类加载时就有 因此static方法不能访问成员的 但是成员的可以访问静态的 所有对象可以共享. 因此常常用作工具,比如Math.PI ...

  10. ZJNU 1422 - 碰撞的小球

    完全弹性碰撞可以视作互相穿过 所以直接考虑只有单个小球的时候,从板子上滑下所需要的时间即可 最后以30000为界分开流读入与缓冲区优化的io方法 //Case4用缓冲区io优化会WA??? /* Wr ...