V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
gonghao
V2EX  ›  Python

求助 Twisted 核心 reactor 理念

  •  
  •   gonghao ·
    gonghao · 2011-10-11 17:25:25 +08:00 · 6727 次点击
    这是一个创建于 4552 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不知又没有童鞋研究过这货,现在有如下一个问题:

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

    目前自己是这样做的:
    基于 Twisted 提供的 http 方法,包装了一个 Request 的类,处理 http 请求,当请求完成之后用 Deferred 对象调用回调。但是目前整个程序就感觉只有这块内容需要用到 reactor 做 main loop,其余部分应该是没必要吧?所以由于 reactor 这个纠结的东西存在,现在自己是把它放到一个 thread 里面做,但是我认为每个请求 reactor.run() 之后,请求完成 reactor.stop() 直接关掉。但是当第二个请求到来时,就没办法再 reactor.run() 抛出 reactor 不可重启的异常,因此感觉目前思路有问题,所以请教有经验的童鞋指点指点~谢谢!
    9 条回复    1970-01-01 08:00:00 +08:00
    makestory
        1
    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
        2
    phus  
       2011-10-11 20:26:01 +08:00
    兄弟看tornado/gevent吧
    gonghao
        3
    gonghao  
    OP
       2011-10-11 20:31:28 +08:00
    @makestory 3Q~~看源码应该是最直接,但需要一些功力啊~有鸭梨~~

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

    http://book.51cto.com/art/200806/77290.htm
    gonghao
        6
    gonghao  
    OP
       2011-10-22 01:25:54 +08:00
    @weijia 灰常感谢,现在我也在重新审视自己之前的理解~应该重新转变观念~
    gonbo
        7
    gonbo  
       2011-10-22 10:51:18 +08:00
    @gonghao 这些都有人做了。scrapy.org
    gonghao
        8
    gonghao  
    OP
       2011-10-22 11:26:34 +08:00
    @gonbo 谢谢哈,我研究研究~
    gonbo
        9
    gonbo  
       2011-10-22 13:06:04 +08:00
    @gonghao 爬虫更多是需要解析分析,爬得快慢,并发多少,好像不是主要的工作。这也是爬虫研究更多的是分布式爬虫,充分利用多个计算机cpu来分析解析爬到的内容。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5325 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 06:01 · PVG 14:01 · LAX 23:01 · JFK 02:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.