用信號量來進行線程同步。該示例來自於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線程被喚醒,繼續執行。