用信号量来进行线程同步。该示例来自于https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter2/08_Thread_synchronization_with_semaphores.html
代码:
# -*- coding:utf-8 -*-
# __author__ = majing
import random
import time
from threading import Thread, Semaphore
s = Semaphore(0)
item = 0
def consumer():
print("consumer is waiting.")
s.acquire()
print("consumer acquire item : ", item)
def producer():
print("producer begin.")
global item
time.sleep(3)
item = random.randint(1, 1000)
print("producer notify : produced item number %s" % item)
s.release()
if __name__ == "__main__":
t1 = Thread(target=producer)
t2 = Thread(target=consumer)
t1.start()
t2.start()
t1.join()
t2.join()
运行结果:
producer begin.
consumer is waiting.
producer notify : produced item number 83
consumer acquire item : 83
由运行结果可以看出,producer线程先运行,但是调用了sleep函数,线程进入睡眠态,处理机调度consumer线程,调用s.acquire()之后,发现s的值小于0,consumer线程被挂起,继续运行producer,然后调用s.release()改变s的值,s的值大于等于0之后,consumer线程被唤醒,继续执行。