锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)
IPC 进程间通信(inter-Process Communicate)
锁机制(Lock)
l = Lock() 开启一个锁机制(实例化) 一把锁配一个钥匙
l.acquire() 获得钥匙,锁门
l.release() 还钥匙,开门
# 模拟银行取钱机制
from multiprocessing import Lock,Process
import time def save_money(l,num):
l.acquire() # 获得钥匙,锁门
for i in range(,):
num +=
print(num)
l.release() # 还钥匙,开门 def draw_money(l,num):
l.acquire()
for i in range(,):
num -=
print(num)
l.release() if __name__ == '__main__':
l = Lock() # 实例化一个锁
num =
p = Process(target=save_money,args=(l,)) # 实例化一个子进程
p.start() # 开启子进程
p1 = Process(target=draw_money,args=(l,)) # 实例化一个子进程
p1.start() # 开启p1这个子进程
time.sleep()
print(num)
# 模拟抢票机制
from multiprocessing import Process,Lock def check_ticket(i): # 不受限制所有人都可以查询
with open('ticket') as f:
num = f.read()
print('第%s个人查到还有%s张票。' % (i,num)) def buy_ticket(i,l): # 受限制的,有一个人在买票的时候其他人不能进行买票操作需要等待上一个人操作完。
l.acquire()
with open('ticket') as f:
num = int(f.read())
if num > 0: # 判断票数是否大于零,否的话则不能进行买不到票。
print('\033[32m 第%s个人买到票了。\033[0m' % i)
num -= 1
else:
print('\033[31m 第%s个人没有买到票。\033[0m' % i)
with open('ticket','w') as f: # 把修改后的票数更新到数据库中(此处为文件中)
f.write(str(num))
l.release() if __name__ == '__main__':
l = Lock()
for i in range(1,11):
p = Process(target=check_ticket,args=(i,))
p.start()
for i in range(1,11):
p1 = Process(target=buy_ticket,args=(i,l))
p1.start()
信号量机制(Semaphore)
sem = Semaphore(5) 实例化一个把锁但是这把锁可以有多把钥匙(此处为5把)
sem.acquire() 获得钥匙,锁门
sem.release() 还钥匙,开门
它比Lock多了一个计数器的功能,程序进行一次acquire钥匙个数就减一,进行release一次钥匙个数就加一,当钥匙数为0时,acquire是处于阻塞状态
# 信号量机制的例子
from multiprocessing import Process,Semaphore
import time
import random def func(i,sem):
sem.acquire() # 获得钥匙,锁门
print('\033[32m 第%s个人进了小黑屋,锁门。\033[0m' % i)
num = random.randint(1, 3)
time.sleep(num)
print(num)
print('\033[31m 第%s个人出了小黑屋,开门。\033[0m' % i)
sem.release() # 还钥匙,开门 if __name__ == '__main__':
sem = Semaphore(3) # 实例化一个信号量机制
for i in range(1,21):
p = Process(target=func,args=(i,sem)) # 实例化子进程
p.start()
事件机制(Event)
e = Event() 实例化一个事件机制
e.set() 将事件机制的is_set()设置为True
e.clear() 将事件机制的is_set()设置为False
e.wait() 事件通过is_set()的bool值来判断它是否阻塞,当bool值为True时,wait() 为非阻塞状态,bool值为False时,wait() 为阻塞状态。
e.is_set() 标识,值是bool类型。
# 事件机制的例子
from multiprocessing import Process,Event
import time def Tra(e):
e.set() # 把is_set()的bool值,设置为True
print('\033[32m 绿灯亮了 \033[0m')
while 1:
if e.is_set(): # 判断is_set()的bool值为True,则wait()非阻塞
time.sleep(5)
print('\033[31m 红灯亮了 \033[0m')
e.clear() # 绿灯时间完,把is_set()的bool值设置成False
else:
time.sleep(5)
print('\033[32m 绿灯亮了 \033[0m')
e.set() # 红灯时间完,需要变成绿灯,所以需要通过set()来把is_set()的bool值设为True def Car(e,i):
e.wait() # 如果is_set()的bool值为True,wait()为非阻塞,可以通车,否则就为阻塞不可以通车
print('第%s辆车通过' % i) if __name__ == '__main__':
e = Event() # 实例化一个事件机制
traffic_light = Process(target=Tra,args=(e,))
traffic_light.start()
for i in range(1,51):
time.sleep(1)
car = Process(target=Car,args=(e,i))
car.start()
锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)的更多相关文章
- 进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38
进程同步(multiprocess.Lock.multiprocess.Semaphore.multiprocess.Event) 锁 —— multiprocess.Lock 通过刚刚的学习,我们千 ...
- Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))
五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...
- 【python】-- 信号量(Semaphore)、event(红绿灯例子)
信号量(Semaphore) 之前讲的线程锁(互斥锁) 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里 ...
- Javascript事件机制兼容性解决方案
本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...
- 【iScroll源码学习03】iScroll事件机制与滚动条的实现
前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...
- jQuery中的事件机制深入浅出
昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...
- gtest 三种事件机制
前言: 1.首先说明gtest中事件的结构层次: 测试程序:一个测试程序只有一个main函数,也可以说是一个可执行程序是一个测试程序.该级别的事件机制会在程序的开始和结束执行. 测试套件:代表一个测试 ...
- ApplicationEvent事件机制源码分析
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- 深入理解React:事件机制原理
目录 序言 DOM事件流 事件捕获阶段.处于目标阶段.事件冒泡阶段 addEventListener 方法 React 事件概述 事件注册 document 上注册 回调函数存储 事件分发 小结 参考 ...
随机推荐
- httpclient httpcore jar包及源码
HttpClient HttpCore HttpComponents jar src download httpclient home help
- 使用postman模拟appium的http请求
Appium是Server,接收http请求,使用Postman模拟请求 1.anyproxy 1.1.安装和运行 #安装 npm i -g anyproxy # 运行anyproxy,端口默认800 ...
- scrapy 抓取拉勾网数据
其实很简单,却因为一些小问题,折腾不少时间,简要记录一下,以备后需. >> scrapy startproject lagou >> cd lagou >> scr ...
- Ubuntu14.04配置jdk1.8.0_25,可切换版本
下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 解压: sudo m ...
- 部署mariadb数据库到linux(源码编译安装)
各种库: apt install -y build-essential zlib1g-dev libpcre3 libpcre3-dev unzip cmake libncurses5-dev lib ...
- ExtJS模版技术
学习ExtJS一段时间以后,大家基本都会对于一些显示数据的组件不太符合需求,可能自己需要的组件在ExtJS里面不存在,这是大家基本就会使用Html属性,直接使用Html进行绘制页面数据展现. 但是,使 ...
- 小朋友学C++(2)
多态 (一) 先编写函数: #include <iostream> using namespace std; class Shape { protected: int width, hei ...
- SpringBoot入门篇--读取资源文件配置
在项目的开发中,我们知道的是SpringBoot框架大大减少了我们的配置文件,但是还是留下了一个application.properties文件让我们可以进行一些配置.当然这些配置必然是包括服务器的配 ...
- Vuex以及axios 看这个
vuex -- 安装 npm i vuex -- 配置 -- 导入vuex import vuex from "vuex" -- vue使用vuex ...
- url的命名与反向解析
url命名和反向解析 1. 命名 # url(r'^press_list/$', views.press_list,name='press_list'), url(r'^pre/$', ...