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