美文网首页
python多线程同步原语(2)——信号量

python多线程同步原语(2)——信号量

作者: mudssky | 来源:发表于2019-06-08 13:32 被阅读0次

多线程同步原语(2)——信号量
锁比较简单,通常如之前锁的例子那样,针对一个全局变量的修改。
当情况更加复杂的时候,比如说,控制一批有限资源的时候,使用信号量会是更好的选择
信号量级一个计数器,当消耗资源的时候,计数减少,当释放资源的时候,计数器增加,因为整体的资源是有限的,所以说,当信号量为最大值的时候,就不能在增加,同时当信号量为最小值的时候,也不能在减少了

这方面我也没想到什么好例子,就用参考书(python核心编程)上的糖果机例子吧。
下面模拟一个简化的糖果机,只有5个可以使用的槽来保存糖果,如果所有槽都满了,就不能往机器中加糖果了。如果所有槽都空了,消费者就无法购买糖果了,就有点像一个固定大小的队列,不同的一点是没有顺序的说法。

python中信号量的使用方法,也类似于锁,用了相同的命名,获取资源acquire,释放资源release

from atexit import register
from random import randrange
from threading import BoundedSemaphore,Lock,Thread
from time import sleep,ctime

lock = Lock()
MAX=5
candytray = BoundedSemaphore(MAX)

# 往糖果盘里装糖果的方法
def refill():
#     对信号量进行+1涉及读写操作,需要上锁
    lock.acquire()
    print('Refilling candy...')
    try:
#         release 对应信号量的释放资源操作,即+1
        candytray.release()
#     若糖果罐满了,会产生ValueError异常
    except ValueError:
        print('full skipping')
    else:
        print('OK')
    lock.release()
    
def buy():
    lock.acquire()
    print('Buying candy...')
#     获取资源也就是糖果
    if candytray.acquire(False):
        print('OK')
    else:
        print('empty',skipping)
    lock.release()

def producer(loops):
    for i in range(loops):
        refill()
        sleep(randrange(3))

def consumer(loops):
    for i in range(loops):
        buy()
        sleep(randrange(3))
    

def main():
    print('starting at:',ctime())
    nloops = randrange(2,6)
    print('THE CANDY MACHINE (full with %d bars)!'%MAX)
    Thread(target=consumer,args=(randrange(nloops,nloops+MAX+2),)).start()
    Thread(target=producer,args=(nloops,)).start()

@register
def _atexit():
    print('all  Done at:',ctime())    
        

if __name__=='__main__':
    main()

starting at: Sat Jun  8 13:25:12 2019
THE CANDY MACHINE (full with 5 bars)!
Buying candy...
OK
Buying candy...
OK
Buying candy...
OK
Buying candy...
OK
Buying candy...
OK
Refilling candy...
OK
Refilling candy...
OK
Refilling candy...
OK
Buying candy...
OK
Refilling candy...
OK
Refilling candy...
OK
Buying candy...
OK
Buying candy...
OK
Buying candy...
OK
Buying candy...
OK

相关文章

  • python多线程同步原语(2)——信号量

    多线程同步原语(2)——信号量锁比较简单,通常如之前锁的例子那样,针对一个全局变量的修改。当情况更加复杂的时候,比...

  • PV原语

    概念 PV原语通过操作信号量来完成进程间的同步和互斥。信号量由操作系统来维护 原语 P原语 为阻塞原语,负责把当前...

  • 一篇文章理清Python多线程之同步条件,信号量和队列

    今天这篇文章大概介绍下python多线程中的同步条件Event,信号量(Semaphore)和队列(queue),...

  • Linux下的信号量使用

    信号量 信号量原语 进程同步的主要方式之一。具体概念参考[《《操作系统概念精要》基本概念整理之进程同步篇(二)》]...

  • 一篇文章理清Python多线程之同步条件,信号量和队列

    公众号:pythonislover 今天这篇文章大概介绍下python多线程中的同步条件Event,信号量(Sem...

  • 17 | ReadWriteLock:如何快速实现一个完备的缓存

    前面我们介绍了管程和信号量这两个同步原语在 Java 语言中的实现,理论上用这两个同步原语中任何一个都可以解决所有...

  • 线程同步

    1.dispatch_semaphore(信号量)的理解及使用2.iOS 多线程同步策略之-----锁NSLock...

  • 学习笔记5

    Linux多线程同步机制 - 信号量信号量函数定义如下:include int semctl(int sem_i...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • 多线程

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

网友评论

      本文标题:python多线程同步原语(2)——信号量

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