tornado 中的阻塞求指教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
nilai

tornado 中的阻塞求指教

  •  
  •   nilai Mar 30, 2014 5809 views
    This topic created in 4410 days ago, the information mentioned may be changed or developed.
    如下代码:
    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    import time
    import os

    from tornado.options import define, options
    define("port", default=8000, help="run on the given port", type=int)

    class IndexHandler(tornado.web.RequestHandler):
    def get(self):
    print "begin"
    #time.sleep(10)
    os.system("ping www.baidu.com -c 10")

    if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/sleep", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()




    现在当浏览器请求地址:
    http://127.0.0.1:8000/sleep 会一直ping 10次百度,此时有另一个用户也访问这个地址, 但是另一个用户会被阻塞掉,一直等到第一个用户ping执行完后 第二个用户才能执行, 怎么样实现非阻塞的操作.
    27 replies    1970-01-01 08:00:00 +08:00
    ponyfk
        1
    ponyfk  
       Mar 30, 2014
    看这个, 结合 subprocess
    http://tornadogists.org/489093/
    但是不推荐
    zenliver
        2
    zenliver  
       Mar 30, 2014
    开个进程池,仍进去
    openroc
        4
    openroc  
       Mar 30, 2014
    @nilai, search tornado.concurrent.run_on_executor
    zenliver
        5
    zenliver  
       Mar 30, 2014
    @yakiang 曼城,,,
    pythonee
        6
    pythonee  
       Mar 30, 2014
    啊,tornado处理请求不是多线程的吗?不是tornado用户,请别喷
    yakiang
        7
    yakiang  
       Mar 30, 2014
    @zenliver 蓝粉 ^ ^ 这是我多个社交帐号的头像
    nilai
        8
    nilai  
    OP
       Mar 30, 2014
    Twisted 呢,能实现这个功能么?
    wangfengmadking
        9
    wangfengmadking  
       Mar 30, 2014
    加异步 coroutine
    zenliver
        10
    zenliver  
       Mar 31, 2014
    @wangfengmadking 线程都阻塞了,加异步没作用的, 本来tornado就不适合cpu bound的应用
    ivanlw
        11
    ivanlw  
       Mar 31, 2014 via iPhone
    @zenliver 什么叫CPU bound呢
    nilai
        12
    nilai  
    OP
       Mar 31, 2014
    @zenliver 那是不是python就干不了这事了?
    zenliver
        13
    zenliver  
       Mar 31, 2014
    @ivanlw cpu密集型
    CMGS
        14
    CMGS  
       Mar 31, 2014
    等等,CPU密集?
    time.sleep也好,os.system这种也好,前者直接 yield tornado.gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 10)这样加入事件循环,后者异步subprocess,tornado里面有tornado.process。

    你是一个大业务循环一百亿次那才叫CPU密集,这只能算IO阻塞,但问题是这样的业务对于单进程单线程的事件驱动模型来说根本就是无解。要解决这种事无外乎就是stackless,线程池这种了,对于传统的CPython而言,只能用进程来解决。
    kingxsp
        15
    kingxsp  
       Mar 31, 2014   1
    查看这里: https://gist.github.com/kingxsp/9884962 应该是个可用的改写。
    nilai
        16
    nilai  
    OP
       Mar 31, 2014
    @kingxsp python2.7下没有 tornado.concurrent
    kingxsp
        17
    kingxsp  
       Mar 31, 2014
    这个并发库在python3自带在python2需要安装sudo pip install futures 即可使用
    kingxsp
        18
    kingxsp  
       Mar 31, 2014
    tornado.concurrent 是有的啊。我就是在python2.7下进行的,到是 futures 是 python3 下默认带的。
    nilai
        19
    nilai  
    OP
       Mar 31, 2014
    @kingxsp


    root@xxxx-All-Series:~# ipython
    Python 2.7.3 (default, Feb 27 2014, 19:58:35)
    Type "copyright", "credits" or "license" for more information.

    IPython 0.12.1 -- An enhanced Interactive Python.
    ? -> Introduction and overview of IPython's features.
    %quickref -> Quick reference.
    help -> Python's own help system.
    object? -> Details about 'object', use 'object??' for extra details.

    In [1]: import tornado.concurrent
    ---------------------------------------------------------------------------
    ImportError Traceback (most recent call last)
    /home/yzy/<ipython-input-1-6952f9510533> in <module>()
    ----> 1 import tornado.concurrent

    ImportError: No module named concurrent
    nilai
        20
    nilai  
    OP
       Mar 31, 2014
    @kingxsp 问题解决了. 是因为tornado 用的apt-get安装的.后来下源码安装就没问题. thanks
    ggarlic
        21
    ggarlic  
       Mar 31, 2014
    @nilai very easy
    使用ProcessProtocol
    https://twistedmatrix.com/documents/13.0.0/core/howto/process.html

    之前看到有人用twisted写爬虫用urlopen嫌慢,其实twisted也有异步的urlopen版本twisted.web.client.getPage

    写异步用同步的time.sleep之类的不是自己给自己找麻烦么
    zenliver
        22
    zenliver  
       Mar 31, 2014
    @ggarlic 顶, 呵呵,,,
    zenliver
        23
    zenliver  
       Mar 31, 2014
    @CMGS 分析的很好, 不过time.sleep不就相当于一个cpu密集型的operation吗
    CMGS
        24
    CMGS  
       Apr 1, 2014
    @zenliver time.sleep 其实比较特殊,为什么说特殊呢,原本是用来模拟大循环(业务向)的CPU密集操作,但是在event-driven的驱动里面,比喻起来应该是suspend,和时间循环是相关的
    nilai
        25
    nilai  
    OP
       Apr 1, 2014
    @ggarlic
    能不能像 kingxsp 来个可用的改写
    ggarlic
        26
    ggarlic  
       Apr 1, 2014
    <script src="https://gist.github.com/ggarlic/f0d5c4135a98cce96c7a.js"></script>
    在我这测试能用,请自行修改ping的路径。
    然后,web开发我不熟,我拿twisted都是写别的东西。用同一个浏览器同时打开几个页面还是会顺序访问,用不同浏览器,或者直接终端里同时跑几个curl就没事。Twisted Network Programming Essentials, 2nd EditionEssential Twisted里关于这个的说明:
    If you run Example 4-10 and then load multiple instances of http://localhost:8000 in a browser, you may still find that the requests are processed serially. This is not Twisted’s fault: some browsers, notably Chrome, serialize requests to the same resource. You can verify that the web server isn’t blocking by issuing several simultaneous requests through cURL or a quick Python script.
    ggarlic
        27
    ggarlic  
       Apr 1, 2014
    About     Help     Advertise     Blog     API     FAQ     Solana     3612 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 54ms UTC 04:43 PVG 12:43 LAX 21:43 JFK 00: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