互斥锁lock、信号量semaphore、事件Event、
1.互斥锁lock
应用在多进程中
互斥所lock:互斥锁是进程间的get_ticket互相排斥
进程之间,谁先枪占到资源,谁就先上锁,等到解锁之后,下一个进程在继续使用。
# 语法:
上锁: lock.acquire()
解锁: lock.release()
(1)基本语法
from multiprocessing import Process,Lock lock = Lock()
# 上锁
lock.acquire()
print(1)
# lock.release() # 如果不解锁,2 就不会打印。
lock.acquire()
print(2)
lock.release()
(2)模拟抢票
from multiprocessing import Process
import json def wr_info(sign,dic=None):
if sign == "r":
with open("ticket.txt" ,mode="r",encoding="utf-8")as fp:
dic = json.load(fp)
return dic
elif sign == "w":
with open("ticket.txt",mode="w",encoding="utf-8")as fp:
json.dump(dic,fp) # 抢票的方法
def get_ticket(person):
# 读取数据库中的实际票数
dic = wr_info("r") time.sleep(0.1)
if dic["count"] > 0:
print("%s 抢票成功 !!"%(person))
dic["count"] -= 1
# 更新数据库
wr_info("w",dic)
else:
print("%s抢票失败"%(person))
# get_ticket("zhangsan")
# 用ticket来进行统一的函数调用
def ticket(person,lock):
# 查询票数
dic = wr_info("r")
print("%s查询票数是%s"%(person,dic["count"]))
# 遇到了acquire上锁之后,进程之间变成同步
lock.acquire()
# 开始签票
get_ticket(person)
lock.release() if __name__ == '__main__':
lock = Lock()
for i in range(5):
p = Process(target=ticket,args=("person%s"%(i),lock))
p.start()
(3)区分同步和异步
from multiprocessing import Process def func(num,lock):
# 同步上锁
lock.acquire()
print(num)
lock.release()
if __name__ == "__main__":
lock = Lock()
for i in range(10):
# 异步并发
p = Process(target=func,args=(i,lock))
p.start()
2.信号量semaphore
本质上就是锁,同一时间可以上多把锁
# 语法:
sem = Semaphore(3)
sem.acquire()
sem.release()
(1)基本用法
import time
import random
from multiprocessing import Process,Semaphore
def ktv(person,sem):
sem.acquire()
print("%s进入了ktv,正在唱歌"%(person))
time.sleep(random.randrange(3,6))
print("%s唱完了,离开了ktv"%(person))
sem.release() if __name__ == "__main__":
sem = Semaphore(3)
for i in range(10):
p = Process(target=ktv,args=("person%s"%(i),sem))
p.start()
注意:
lock 多个进程之间,一次只能上一把锁
Semaphore 多个进程之间,可以自定义上锁的数量,不限于一个
3.事件Event
# 阻塞事件
e = Event()生成事件对象e
e.wait()动态给程序加阻塞,程序当中是否加阻塞完全取决与该对象中的is_set()[默认返回值是False]
# 如果是True,不加阻塞
# 如果是False 加阻塞
#控制这个属性的值
# set()方法 将这个属性的值改成True
# clear()方法 将这个属性的值改成False
# is_set()方法 判断当前的属性是否为True (默认上来是False)
(1)基本语法
from multiprocessing import Process,Event
e = Event() # 实例化,生成对象e
print(e.is_set()) # 查看对象e中的is_set()是True还是False。默认是False
e.wait() # 加阻塞。is_set()是False
print(1) # (2)
e = Event()
e.set() # 将is_set() 改成True
e.wait() # 不加阻塞
print(3) e.clear() # 把True=>False
e.wait()
print(444)
(2)红绿灯
import time,random
from multiprocessing import Process,Event
def traffic_light(e):
# 默认红灯亮
print("红灯亮")
while True:
if e.is_set():
# 让绿灯亮1秒钟
time.sleep(1)
#切换红灯亮
print("红灯亮")
# 把True改成False
e.clear()
else:
# 让红灯亮1秒钟
time.sleep(1)
# 切换成绿灯亮
print("绿灯亮")
# 把默认值从False改成True
e.set() def car(e,i):
# 判断如果是红灯亮,就执行下面代码
if not e.is_set():
print("car%s 在等待"% (i))
e.wait()
print("car%s通行了"%(i)) """
# 方法一
if __name__ == "__main__":
e = Event()
# 创建交通灯对象
p1 = Process(target=traffic_light,args=(e,))
p1.start() # 创建小车
for i in range(10):
time.sleep(random.randrange(0,2))
p2 = Process(target=car,args=(e,i))
p2.start() """ # 方法二: 优化红绿灯代码[当小车执行结束的时候,把红绿灯终止]
if __name__ == '__main__':
lst = []
e = Event()
# 创建交通灯对象
p1 = Process(target=traffic_light,args=(e,))
p1.daemon=True
p1.start() # 创建小车
for i in range(20):
time.sleep(random.randrange(0,2))
p2 = Process(target=car,args=(e,i))
p2.start() # 等所有小车通行之后,关闭守护程序
for i in lst:
i.join() print("主程序执行结束。。。")
互斥锁lock、信号量semaphore、事件Event、的更多相关文章
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
- 线程之死锁、递归锁、信号量、事件Event 、定时器
1.死锁的现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相 ...
- 【Python下进程同步之互斥锁、信号量、事件机制】
" 一.锁机制: multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的 ...
- python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...
- java中的互斥锁和信号量的区别
互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此.也就是说,信号量可以使资源同时被多个线程访问,而互斥锁 ...
- python线程互斥锁Lock(29)
在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题, ...
- C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】
多线程编程之锁的使用[互斥锁(lock)和读写锁(ReadWriteLock)] http://blog.csdn.net/sqqyq/article/details/18651335 多线程程序写日 ...
- 线程使用方法 锁(lock,Rlock),信号了(Semaphore),事件(Event),条件(Ccndition),定时器(timer)
2线程的使用方法 (1)锁机制 递归锁 RLock() 可以有无止尽的锁,但是会有一把万能钥匙 互斥锁: Lock() ...
随机推荐
- Linux系统上对其他用户隐藏进程的简单方法
mount -o remount,rw,hidepid=2 /proc 我使用的是多用户系统,大部分的用户通过ssh客户端访问他们的资源.我如何(怎么样)避免泄露进程信息给他们?如何(怎么样)在Deb ...
- redis——redis的一些核心把握
redis单线程,为什么比较快 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程.redis能够快速执行的原因有三点: (1) 绝大 ...
- VS---《在VS2010中 使用C++创建和使用DLL》(002)
VS---<在VS2010中 使用C++创建和使用DLL>(002) 前面初认识了创建和调用DLL,在VS工程下可以通过在 同一工程.不同工程 下创建和调用DLL.现在,同一工程下创建和调 ...
- ClassLoader源码分析与实例剖析
在之前已经对类加载器做了不少实验了,这次主要是来分析一下ClassLoader的源码,当然主要是先从理解官方给它的注释开始,为之后自定义类加载器打好坚石的基础,下面开始: 而从类的层次结构来看也能感受 ...
- js动画fireworks烟花
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 解读>/dev/null 2>&1
背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的语句.以前的我并没有去深入地理解这段命令的作用,照搬照用,今天开始去解读>/dev/null 2&g ...
- 【Wince-禁止重复启动程序】Wince 不重复启动程序
创建类Mutex.cs: using System; using System.Linq; using System.Collections.Generic; using System.Text; u ...
- 【转】pe结构详解
(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...
- PHP mysqli_real_connect() 函数
定义和用法mysqli_real_connect() 函数打开一个到 MySQL 服务器的新连接. mysqli_real_connect() 函数与 mysqli_connect() 函数在以下几个 ...
- 查看API工具 https://editor.swagger.io/
The base URL for the API is: https://api.cloud.nalantis.com/api/ The OpenAPI documentation is ava ...