求助 Twisted 核心 reactor 理念 - V2EX
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 7888 次点击
    这是一个创建于 5179 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不知又没有童鞋研究过这货,现在有如下一个问题:

    自己想做一个 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     Solana     5182 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 07:43 PVG 15:43 LAX 23:43 JFK 02:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86