:class:~tornado.queues.Queue 示例 - 一个并发网络爬虫

.. currentmodule:: tornado.queues

Tornado的 tornado.queues 模块实现了异步生产者/消费者模式的协程, 类似于 通过Python 标准库的 queue 实现线程模式.

一个yield Queue.get 的协程直到队列中有值的时候才会暂停. 如果队列设置了最大长度 yield Queue.put 的协程直到队列中有空间才会暂停.

一个 ~Queue 从0开始对完成的任务进行计数. ~Queue.put 加计数; ~Queue.task_done 减少计数.

这里的网络爬虫的例子, 队列开始的时候只包含 base_url. 当一个worker抓取到一个页面 它会解析链接并把它添加到队列中, 然后调用 ~Queue.task_done 减少计数一次. 最后, 当一个worker抓取到的页面URL都是之前抓取到过的并且队列中没有任务了. 于是worker调用 ~Queue.task_done 把计数减到0. 等待 ~Queue.join 的主协程取消暂停并且完成.

.. literalinclude:: ../../demos/webspider/webspider.py