美文网首页
python 的锁、信号量和事件

python 的锁、信号量和事件

作者: dongshangtong | 来源:发表于2019-06-17 16:04 被阅读0次

在python使用Lock 机制

from multiprocessing import Process, Value, Lock
import time

#  Value  是实现进程之间的共用问题

def get_money(num, l):
    l.acquire()  # 上锁
    for i in range(100):
        num.value -= 1
        print(num.value)
        time.sleep(0.01)
    l.release()  # 开锁


def put_money(num, l):
    l.acquire()  # 上锁

    for i in range(100):
        num.value += 1
        print(num.value)
        time.sleep(0.01)
    l.release()  # 开锁


if __name__ == '__main__':
    num = Value('i', 100)
    l = Lock()

    gp = Process(target=get_money, args=(num, l))
    gp.start()

    pp = Process(target=put_money, args=(num, l))
    pp.start()

    gp.join()
    pp.join()

    print('主进程:', num.value)

在python使用Semaphore机制

1.信号量机制比锁机制多了一个计数器,
这个计数器是用来记录当前剩余几把钥匙的。
2.当计数器为0时,表示没有钥匙了,此时acquire()处于阻塞。
3.对于计数器来说,每acquire一次,计数器内部就减1,release一次,计数器就加1

from multiprocessing import Process, Semaphore
import time
import random


def func(i, sem):
    sem.acquire()
    print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)
    time.sleep(random.randint(3, 5))
    print('第%s个人出去小黑屋,还了钥匙打开门' % i)

    sem.release()


if __name__ == '__main__':
# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋
# 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入
    sem = Semaphore(5)
    for i in range(20):
        p = Process(target=func, args=(i, sem,))
        p.start()

在python使用Event机制

1.事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态
2.当is_set()的bool值为False时,e.wait()是阻塞状态
3.当is_set()的bool值为True时,e.wait()是非阻塞状态
4.当使用set()时,是把is_set的bool变为True
5.当使用clear()时,是把is_set的bool变为False

from multiprocessing import Process, Event
import time
import random


def tra(e):
    while 1:# 红绿灯得一直亮着,要么是红灯要么是绿灯
        if e.is_set():# True,代表绿灯亮,那么此时代表可以过车
            time.sleep(5) # 所以在这让灯等5秒钟,这段时间让车过
            print('\033[31m 红灯亮! \033[0m') # 绿灯亮了5秒后应该提示到红灯亮
            e.clear() # 把is_set设置为False
        else:
            time.sleep(5) # 此时代表红灯亮了,此时应该红灯亮5秒,在此等5秒
            print('\033[32m 绿灯亮! \033[0m') # 红的亮够5秒后,该绿灯亮了
            e.set()# 将is_set设置为True


def mycar(i, e):
    e.wait() # 车等在红绿灯,此时要看是红灯还是绿灯,如果is_set为True就是绿灯,此时可以过车
    print('第%s辆车过去了' % i)


if __name__ == '__main__':

    e = Event()
    triff_light = Process(target=tra, args=(e,))# 信号灯的进程
    triff_light.start()
    for i in range(50): # 信号灯的进程
        if i % 3 == 0:
            time.sleep(2)
        car = Process(target=mycar, args=(i + 1, e,))
        car.start()

相关文章

  • python 的锁、信号量和事件

    在python使用Lock 机制 在python使用Semaphore机制 1.信号量机制比锁机制多了一个计数器,...

  • 并发编程-进程同步控制

    锁/信号量/事件 1.锁 2.信号量 3.事件 1.进程锁 2.信号量 一次只能有指定的数量的进程来操作一套资源。...

  • 进程相关问题学习

    写在前面,进程同步控制有锁,信号量,事件进程间通信有 队列和管道 信号量相当于多个锁 事件控制进程的动作 红绿灯问...

  • Linux内核设计与实现——内核同步方法

    主要内容 原子操作 自旋锁 读写自旋锁 信号量 读写信号量 互斥锁 完成变量 大内核锁 顺序锁 禁止抢占 顺序和屏...

  • 并发编程-线程

    线程 GIL 守护线程 线程锁(互斥锁 and 递归锁) 信号量 事件 条件 定时器 1.线程: 特点在多线程的操...

  • (十九)AQS实现原理(具体例子待总结)

    AbstractQueuedSynchronizer,提供FIFO队列,构建锁或者其他同步组件(信号量、事件等、R...

  • iOS锁

    锁的作用:保证线程安全。锁的分类:互斥锁,自旋锁,其它比如条件锁,递归锁,信号量都是上层的封装和实现。 互斥锁 防...

  • AQS

    AQS解析 AQS通过FIFO的等待队列,提供了一个用来实现阻塞锁和相关的同步器(信号量、事件机制)的框架,它是很...

  • AQS源码浅析(1)——类注释概述

    概览 类注释 AQS是一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。此...

  • AbstractQueuedSynchronizer

    提供了实现阻塞锁和相关同步器依靠先入先出(FIFO)等待队列(信号量,事件等)的框架. 此类设计对于大多数种类的依...

网友评论

      本文标题:python 的锁、信号量和事件

      本文链接:https://www.haomeiwen.com/subject/evnafctx.html