12.3 程序中如果有多个线程,我们想在这些线程之间实现安全的通信或者交换数据
from queue import Queue
from threading import Thread
import time
def producer(out_q):
while True:
time.sleep(5)
out_q.put("test")
print("produce data")
def consumer(in_q):
while True:
time.sleep(6)
data = in_q.get()
print("consumer",data)
- Queue 实例已经拥有了所有所需要的锁,所以她们
q = Queue()
t1 = Thread(target=producer,args=(q,))
t2 = Thread(target=consumer,args=(q,))
t1.start()
t2.start()
[root@apollo gnsun]# python thread.py
produce data
consumer test
produce data
consumer test
produce data
consumer test
produce data
- 下一个问题就是如何对生产者和消费者的关闭过程也进行同步协调呢
from queue import Queue
from threading import Thread
import time
_sentinal = object()
def producer(out_q,n):
while n>0:
time.sleep(5)
data = "test{0}".format(n)
out_q.put(data)
print("produce data ",n)
n -=1
out_q.put(_sentinal)
def consumer(in_q):
while True:
time.sleep(6)
data = in_q.get()
print("consumer",data)
if data is _sentinal:
in_q.put(_sentinal)
break
q = Queue()
t1 = Thread(target=producer,args=(q,5,))
t2 = Thread(target=consumer,args=(q,))
t1.start()
t2.start()
- 当消费者收到这个特殊的终止后,会立刻重新放回队列中,这样是的在同一个队列上监听的其它消费者线程也会接收到终止,可以将所有都关闭掉
[root@apollo gnsun]# python thread.py
produce data 5
consumer test5
produce data 4
consumer test4
produce data 3
consumer test3
produce data 2
consumer test2
produce data 1
consumer test1
网友评论