生産者と消費者:二つのスレッド間の通信
パイソンは、FIFO(先入れ先出し)キューキュー、LIFO(最後にファーストアウト)キューLifoQueue、およびプライオリティキュー優先度つきキューを含む、同期キュー、キューベースのスレッドセーフが設けられています。これらのキューは、ロックの原理を実現している(または最後まで行わないのいずれかことがアトミック動作として理解することができる)、それは、複数のスレッドに直接使用することができます。
キューは、スレッド間の同期を達成するために使用することができます。
コードの実装
import threading
import queue
import random
import time
def produce(q):
i = 0
while i < 10:
num = random.randint(1,100)
q.put('生产者生产数据:%d' % num)
print('生产者生产数据:%d' % num)
time.sleep(1)
i += 1
q.put(None)
# 完成任务
q.task_done()
def consume(q):
while True:
item = q.get()
if item is None:
break
print('消费者获取到:%s' % item)
time.sleep(1)
# 完成任务
q.task_done()
if __name__ == '__main__':
q = queue.Queue(10)
arr = []
# 创建生产者
th = threading.Thread(target=produce,args=(q,))
th.start()
# 创建消费者
tc = threading.Thread(target=consume,args=(q,))
tc.start()
th.join()
tc.join()
出力:
生产者生产数据:65
消费者获取到:生产者生产数据:65
生产者生产数据:52
消费者获取到:生产者生产数据:52
生产者生产数据:19
消费者获取到:生产者生产数据:19
生产者生产数据:42
消费者获取到:生产者生产数据:42
生产者生产数据:9
消费者获取到:生产者生产数据:9
生产者生产数据:10
消费者获取到:生产者生产数据:10
生产者生产数据:45
消费者获取到:生产者生产数据:45
生产者生产数据:90
消费者获取到:生产者生产数据:90
生产者生产数据:25
消费者获取到:生产者生产数据:25
生产者生产数据:9
消费者获取到:生产者生产数据:9