求助 Twisted 核心 reactor 理念

2011-10-11 17:25:25 +08:00
 gonghao
不知又没有童鞋研究过这货,现在有如下一个问题:

自己想做一个 http 客户端,到网站抓取内容,同时该客户端相当于一个 api,需要将抓取到的内容处理之后返回给 api 调用端(这个调用初步打算就是本地调用,基于库的调用)。由于看到 Twisted 的异步事件比较给力,所以索性尝试尝试,但是对于其核心的 reactor 理念还不甚掌握,整个想法进行下来,感觉有太多 tricky 的东西在里面。

目前自己是这样做的:
基于 Twisted 提供的 http 方法,包装了一个 Request 的类,处理 http 请求,当请求完成之后用 Deferred 对象调用回调。但是目前整个程序就感觉只有这块内容需要用到 reactor 做 main loop,其余部分应该是没必要吧?所以由于 reactor 这个纠结的东西存在,现在自己是把它放到一个 thread 里面做,但是我认为每个请求 reactor.run() 之后,请求完成 reactor.stop() 直接关掉。但是当第二个请求到来时,就没办法再 reactor.run() 抛出 reactor 不可重启的异常,因此感觉目前思路有问题,所以请教有经验的童鞋指点指点~谢谢!
7051 次点击
所在节点    Python
9 条回复
makestory
2011-10-11 20:23:19 +08:00
没有用过 Twisted ,不过刚好看到了文章有解释 reactor 。拿来给楼主参考下 http://thinkinweb.heroku.com/posts/5-ruby (见 Non blocking 那部分)

建议看下 reactor.run() ,reactor.stop() 的源码~ 感觉像是用法有问题
phus
2011-10-11 20:26:01 +08:00
兄弟看tornado/gevent吧
gonghao
2011-10-11 20:31:28 +08:00
@makestory 3Q~~看源码应该是最直接,但需要一些功力啊~有鸭梨~~

@phus 额,这次主要是想用一下 twisted 的这个异步事件,体验一下~由于是搞 js 的,所以想要体验一把 python 里面的异步,嘻嘻~不过对于我这种需求,直接上一个 tornado 是不是能用到的功能也不多哦~ twisted 主要就是用它的 defer 和 http 的一些东西~
gonghao
2011-10-11 20:32:53 +08:00
@phus 额,刚木有仔细看 tornado 文档,现在发现有这个模块 tornado.httpclient — Non-blocking HTTP client ~嘻嘻,谢谢哈,我研究研究~
weijia
2011-10-21 23:41:56 +08:00
reactor是类似于windows的消息处理循环。一直在那里等待新连接,或者时间之类事件,应该是在整个应用程序生命周期内运行。为什么要处理完一个消息就stop啊?就应该一直让reactor运行,让他在有新连接进来时生成request来处理请求。搜了一个介绍的。不知道有没有帮助。

http://book.51cto.com/art/200806/77290.htm
gonghao
2011-10-22 01:25:54 +08:00
@weijia 灰常感谢,现在我也在重新审视自己之前的理解~应该重新转变观念~
gonbo
2011-10-22 10:51:18 +08:00
@gonghao 这些都有人做了。scrapy.org
gonghao
2011-10-22 11:26:34 +08:00
@gonbo 谢谢哈,我研究研究~
gonbo
2011-10-22 13:06:04 +08:00
@gonghao 爬虫更多是需要解析分析,爬得快慢,并发多少,好像不是主要的工作。这也是爬虫研究更多的是分布式爬虫,充分利用多个计算机cpu来分析解析爬到的内容。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/19315

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX