Tornado的 tornado.queues
模块实现了异步生产者/消费者模式的协程,类似于通过Python 标准库的 queue
实现线程模式。
一个yields Queue.get
的协程直到队列中有值的时候才会暂停。如果队列设置了最大长度,yields Queue.put
的协程直到队列中有空间才会暂停。
一个 Queue
从0开始对未完成的任务进行计数, put
加计数; task_done
减少计数。
这里的网络爬虫的例子,队列开始的时候只包含 base_url。当一个 worker 抓取到一个页面它会解析链接并把它添加到队列中,然后调用 task_done
减少计数一次。最后,当一个 worker 抓取到的页面 URL 都是之前抓取到过的并且队列中没有任务了。于是 worker 调用 task_done
把计数减到0。等待 join
的主协程取消暂停并且完成。
1 | #!/usr/bin/env python |
Read More: