锁机制(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 上注册 回调函数存储 事件分发 小结 参考 ...
随机推荐
- java学习——构造类之3!+5!=126
package my_project; import java.util.Scanner; public class my_first_class { public static void main( ...
- CefSharp v62修改,支持.net4.0
吐槽一下,博客园久了没有上,账号没了,重新申请一个. cesharp v62版本,内核采用最新的Cef 62,支持最新的Grid布局. 由于官方的cefsharp 采用.net4.5.2开发.怎么办怎 ...
- Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(六)GameplayEffect的级别设置
本节的内容不难,权当是复习.如果没有完成前面的教程,请前往学习. 第一步:用一个csv文件表示级别数据,下图中的Hurt随级别1~7表示其损伤值在1~7级别时分别是-7,-14,-20等.写好之后关闭 ...
- Linux网络编程经典书籍推荐
UNIX环境高级编程<高级unix环境编程><unix网络编程><深入理解计算机系统>比较好 =====================Linux网络编程经典书籍推 ...
- javascript继承之借用构造函数(二)
//简单的函数调用 function Father() { this.nums= [1,2]; } function Son() { Father.call(this);//调用超类型,完成son继承 ...
- 小项目,吃货联盟,java初级小项目,源代码
1:项目的实现效果.功能如图所示. 2:项目的源代码如下: import java.util.Scanner; /** * 吃货联盟订餐管理系统 * */ public class OrderingM ...
- no_unnest,push_subq,push_pred的用法 (转)
常常有人把这三个hint搞混,主要是因为对三种重写原理不清楚.特总结如下.(实验环境为10204)1. no_unnest, unnestunnest我们称为对子查询展开,顾名思义,就是别让子查询孤单 ...
- catpcha
生成随机验证码: # -*- coding: utf-8 -*- # @Author: huangyong # @Date: 2016-10-29 22:18:38 # @Last Modified ...
- spring data jpa 原生查询(查一个json中的某一字段)
数据库: jpa 查询 java: @Component("ediHistoryDAO") public interface EdiHistoryDAO extends CrudR ...
- Eclipse 中yml自动提示功能相关设置
转自:https://blog.csdn.net/lililuni/article/details/82849376