比较多进程与Twisted
我遇到一个情况,需要解析网站。每个网站都需要自己专门的“解析器”,可能还要有自己处理 cookies 等的方式。
我在考虑哪种选择更好。
选择一: 我可以创建一个多进程的功能,主程序接收一个网址,然后在主程序内部启动一个进程/功能,来处理所有的设置、获取和解析页面/网址。
这种方法会有一个主程序在运行,然后它会创建多个内部功能的实例。这样应该会很快,是吧?
选择二: 我可以创建一个“Twisted”类型的服务器,基本上和选择一做的事情是一样的。不同的是,使用“Twisted”会增加一些额外的负担。我在评估 Twisted,考虑它作为一个“服务器”的时候,但我并不需要它来获取网址。
选择三: 我可以使用 scrapy。我倾向于不走这条路,因为我不想/不需要使用 scrapy 似乎带来的额外负担。正如我所说,每个目标网址都需要自己的解析功能,还要处理 cookies……
我的目标是基本上让这个“架构”解决方案分布在多个机器上,每个客户端机器与一个主服务器连接,主服务器分配需要解析的网址。
感谢任何评论……
-tom
2 个回答
对于这个问题,我建议使用多进程处理。这种方法简单易用,也容易理解。你并不特别需要使用 twisted,所以没必要增加额外的复杂性。
还有一个你可以考虑的选项:使用消息队列。让主程序把网址放到一个队列里(比如 beanstalkd、resque、0mq),然后让工作进程去取这些网址并处理。这样你就能实现同时处理和分布式处理:你可以在任意多台机器上运行工作进程。
这个问题有两个方面:并发和分布。
并发:使用Twisted或者多进程都可以同时处理获取和解析的任务。不过,我不太明白你说的“Twisted开销”是从哪里来的。实际上,使用多进程会产生更多的开销,因为需要启动一个相对比较重的操作系统进程。而Twisted处理并发的方式要轻便得多。
分布:多进程无法将你的获取和解析任务分配到不同的机器上。而Twisted可以做到这一点,比如使用AMP协议的构建功能。
至于scrapy,我没有使用过,所以无法评论。