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、的更多相关文章

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

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

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

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

  3. 线程之死锁、递归锁、信号量、事件Event 、定时器

    1.死锁的现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相 ...

  4. 【Python下进程同步之互斥锁、信号量、事件机制】

    " 一.锁机制:  multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的 ...

  5. python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...

  6. java中的互斥锁和信号量的区别

    互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此.也就是说,信号量可以使资源同时被多个线程访问,而互斥锁 ...

  7. python线程互斥锁Lock(29)

    在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题, ...

  8. C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】

    多线程编程之锁的使用[互斥锁(lock)和读写锁(ReadWriteLock)] http://blog.csdn.net/sqqyq/article/details/18651335 多线程程序写日 ...

  9. 线程使用方法 锁(lock,Rlock),信号了(Semaphore),事件(Event),条件(Ccndition),定时器(timer)

    2线程的使用方法  (1)锁机制       递归锁           RLock()    可以有无止尽的锁,但是会有一把万能钥匙       互斥锁:           Lock()     ...

随机推荐

  1. 英语是学习Java编程的基础吗

    就当前市场行情需求来看,Java人才需求依旧火爆,在如今互联网时代,手机移动端的软件开发是非常重要的,如今无论是大中小企业都是需要进行软件的开发的,又因为Java是开源的使用起来可以节约一大批的成本, ...

  2. 使用 visual studio 2019 社区版打开touchgfx工程注意项

    @2019-09-23 [环境] touchgfx designer 4.10.0 visual studio 2019 社区版 [问题] #error 1 使用 visual studio 2019 ...

  3. u-boot从nand 启动时的问题解决记录

    u-boot从nand 启动时的问题解决记录 问题描述: 使用u-boot-1.1.6版本u-boot移植到JZ2440开发板上,当前已经能够从Nor启动,但是不能从Nand正常启动(u-boot大小 ...

  4. 解读Position

    首先Position在字面讲是位置的意思,在HTML中是定位的意思,它有四种属性:分别是static是静态的,也是默认的效果,没有特别的设定,遵循基本的定位规定,不能通过z-index进行层次分级. ...

  5. linux——实际工作中如何使用linux

    实际工作中,linux系统都不会在我们自己的电脑上,linux系统安装在机房的服务器上,我们操作linux不可能跑到机房去,所以我们需要有一个工具,能在公司通过网络远程连接到机房的linux服务器上 ...

  6. 01.CNN调参

    转载:调参是个头疼的事情,Yann LeCun.Yoshua Bengio和Geoffrey Hinton这些大牛为什么能够跳出各种牛逼的网络? 下面一些推荐的书和文章:调参资料总结Neural Ne ...

  7. Excel 中大量图片如何快速导出? 转载自:http://www.zhihu.com/question/20800948

    我的办法如下,应该也不慢. 如果是针对以.xlsx为后缀的表格(Excel2007以上的版本),这样做:显示后缀的情况下,直接重命名,把后缀.xlsx改成.rar或者.zip,然后解压出里面的图片文件 ...

  8. 在cubemx中使用freertos中的注意事项

    就是使用信号量等rtos自带特性的时候,务必先初始化然后在发生信号量或接收. 而且在中断中发送信号量或队列的时候,务必把使能中断的语句放在初始化freertos之后,尤其是cubemx生成的代码,默认 ...

  9. Java8-Stream-No.05

    import java.util.Arrays; import java.util.List; import java.util.function.Supplier; import java.util ...

  10. Java中的集合List、ArrayList、Vector、Stack(三)

    List接口 List集合代表一个有序集合,集合中每一个元素都有其对应的顺序索引.List集合容许使用重复元素,可以通过索引来访问指定位置的集合对象. ArrayList和Vector实现类 Arra ...