在Python中进行多线程/并发编程有哪些选择?
我正在写一个简单的网站爬虫,趁这个机会想学习一些Python中的并发编程。我决定不使用线程和队列,而是尝试其他方法,但我不知道哪种方法适合我。
我听说过Stackless、Celery、Twisted、Tornado等东西。我不想设置数据库和Celery的其他依赖项,但如果它真的适合我的需求,我也愿意这样做。
我的问题是:在适合我的应用和一般实用性之间,什么是一个好的平衡点?我看过Stackless中的任务单元,但不确定urlopen()调用是否会阻塞,或者它们是否会并行执行,我在任何地方都没有看到提到这一点。
有人能给我一些关于我的选择的细节,以及什么是最好的选择吗?
谢谢。
3 个回答
1
想要快速查看一些软件包的大小,可以去这个网站:ohloh.net/p/compare。
当然,源代码的大小只是一个大概的指标(我其实更想知道文档的页数、示例的页数,还有依赖关系),但这也能提供一些帮助。
2
我必须说,Twisted是我推荐的选择。
在Twisted中,做事件驱动的任务非常简单。它与其他重要的系统组件,比如GTK+和DBus,结合起来也很容易。
目前HTTP客户端的支持比较基础,但在不断改进中(版本大于9.0.0):可以查看相关问题。
额外的好处是,Twisted可以在Ubuntu的默认软件库中找到;-)
4
Tornado 是一个网络服务器,所以它对你写爬虫帮助不大。Twisted 则更通用(但也相对复杂),适合各种网络任务(而且能很好地和几个图形界面框架的事件循环结合)。实际上,之前有一个叫 twisted.web.spider 的东西(但多年前就被删掉了,因为没人维护了——所以你得自己在 Twisted 提供的功能基础上开发爬虫)。