ds之队列

python当中的队列

源码在 Lib/queue.py

提供三种队列

  • Queue(普通先进先出队列)
  • LifoQueue(后进先出队列)
  • PriorityQueue(优先级队列)

提供封装的方法为

  • qsize
  • empty
  • full
  • put
  • put_nowait
  • get
  • get_nowait
  • task_done
  • join

这里着重说一下join()

阻塞调用线程,直到队列中的所有任务被处理掉。

只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()以指示该项目已检索并且其上的所有工作都已完成时,计数将减少。当未完成的任务数降到0,join()解除阻塞。

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def worker():
while True:
item = q.get()
if item is None:
break
do_work(item)
q.task_done()

q = queue.Queue()
threads = []
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.start()
threads.append(t)

for item in source():
q.put(item)

# block until all tasks are done
q.join()

# stop workers
for i in range(num_worker_threads):
q.put(None)
for t in threads:
t.join()