【Python@Thread】Semaphore&糖果机

信号量适用与多线程竞争有限资源的情况。

 1 from atexit import register
 2 from time import ctime, sleep
 3 from threading import Thread, Lock, BoundedSemaphore
 4 from random import randrange
 5 
 6 lock = Lock()
 7 MAX = 5                             #信号量大小
 8 candytray = BoundedSemaphore(MAX)
 9 
10 
11 def refull():
12     with lock:
13         print('refulling...')
14         try:
15             candytray.release()
16         except ValueError:
17             print('Is Full!')
18         else:
19             print('OK')
20 
21 def buy():
22     with lock:
23         print('buying...')
24         if candytray.acquire(False):    #加入False参数,如果信号量为空,则不阻塞,而是返回错误,感觉类似与C语言中的pthread_mutex_trylock
25             print('OK')
26         else:
27             print('empty')
28 
29 def consumer(loops):
30     for i in range(loops):
31         refull()
32         sleep(randrange(3))             #睡眠时间尽量长于creater的概率尽量大,
33 
34 
35 def creater(loops):
36     for i in range(loops):
37         buy()
38         sleep(randrange(5))
39 
40 
41 def main():
42     print('starting...')
43     n = randrange(2,6)
44     print('the candy mechine full with {0}'.format(MAX))
45     Thread(target=creater,args=(randrange(n,n+MAX+2),)).start()
46     Thread(target=consumer, args=(randrange(n,n+MAX+2),)).start()
47 
48 
49 @register
50 def atexitt():
51     print('The end!')
52 
53 
54 if __name__ == '__main__':
55     main()

输出结果:

参考资料:Python核心编程.第四章.Wesley Chun著

 

posted @ 2016-12-20 23:46  wilderness  阅读(348)  评论(0编辑  收藏  举报