queue
在获取端阻塞
from queue import Queue
from threading import Thread
queue = Queue()
def consumer():
print("Consumer waiting")
queue.get() # 会阻塞等待put()
print("Consumer done")
thread = Thread(target=consumer)
thread.start()
print("Producer putting")
queue.put(object())
thread.join()
print("Producer Done")
# Consumer waiting
# Producer putting
# Consumer done
# Producer Done
在添加端阻塞
from queue import Queue
from threading import Thread
import time
queue = Queue(1) # 这里把缓冲区设为1,
# 意味着第一个put后,如果没有被消耗
# 会阻塞在第二个put那里
def consumer():
time.sleep(0.1) # 在get前,率先put, 然后阻塞在第二个put上
queue.get()
print("Consumer got 1")
queue.get()
print("Consumer got 2")
thread = Thread(target=consumer)
thread.start()
queue.put(object())
print("Producer put 1")
queue.put(object())
print("Producer put 2")
thread.join()
print("Producer done")
# Producer put 1
# Consumer got 1
# Producer put 2
# Consumer got 2
# Producer done
追踪工作进度
from queue import Queue
from threading import Thread
queue = Queue()
def consumer():
print("Consumer waiting")
queue.get()
print("Consumer done")
queue.task_done()
Thread(target=consumer).start() # 线程不需要调用join方法
queue.put(object())
print("Producer waitting")
queue.join() # queue 调用join,等待结束即可
print("Producer done")
# Consumer waiting
# Producer waitting
# Consumer done
# Producer done