Tornado如何实现这样一种任务队列

我现在有一个这样的需求:有一个爬虫函数是用Python写的,刚好现在有一个网站也是用Python的Tornado写的。我想实现在Tornado接收到一个新增任务的请求之后,自动将这个请求放入任务队列,然后爬虫函数自动从任务队列中取出数据来。
由于网站规模并不大,为了部署方便不想使用redis或者其他消息队列服务,如何让爬虫函数和Tornado写的web程序能够相互通信呢?
我现在的思路是建立一个main.py文件,然后先用queue模块创建一个队列,然后用threading库同时启动n个爬虫函数的线程从queue中取数据,然后Toronto的handler里面再往queue中put数据,但是用代码实现就会出现包循环引用导致报错的现象。有什么办法能够让两个模块共享一个线程安全的数据结构呢?

阅读 3.8k
2 个回答

用数据库恐怕还是最好的方式

因为
1、要考虑任务修改,增加,中断, 放内存马上涉及到持久化的问题,自己解决不如用数据库。
2、哪些爬过了,哪些没有,什么时间爬出的,多久需要重爬一次,爬过的数据如何筛选处理,数据库都能轻而易举地实现
3、并发、扩展、备份数据都有现成的方案

建议参考一下pyspider的设计,题主提的功能对pyspider来说都是现成,重新写代码的必要性是不是要考虑一下呢?

你说的包循环引用出错,这种情况是可以避免的。你只要调整下主程序运行的方式,使得Queue在两个项目主程序启动之前申明,作为一个公共变量分别传入到两个项目的主程序里去,主程序再层层下发配置这个Queue的使用。并不会存在什么循环引用的问题,出现这个问题只是你代码结构没调整好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题