Import tornado.web # tornado的基礎web框架模塊web
Import tornado.ioloop # tornado的核心IO模塊, 封裝了Linux的epoll模塊服務器
一. Tornado服務的啓動要素:app
1. 核心代碼以下:框架
Tornado.web.Application().listen(端口, ip) # 配置tornado參數, listen()用來設置http請求相關,服務沒有啓動tornado
Tornado.ioloop.IOLoop.instance().start() # 開始事件循環, 啓服務oop
一般在Tornado.web.Application()對象實例化時, 給Application類傳入路由映射表及setings配置信息.spa
解析Application是Tornado.web框架的核心應用類, 是與服務器對應的接口.3d
2. 手動建立http服務器server
上面在實例化Application類後直接調用的listen()方法來設置的http請求服務器, 咱們沒法進行些個性化配置對象
手動建立http服務器可實現, 以下:
Import tornado.httpserver # 引入內置模塊,來改寫下啓服務以前的代碼:
obj = tornado.web.Application([(路由映射關係), ...])
httpserver = tornado.httpserver.HTTPServer( obj ) # 這兩行和起來的做用至關於上面的一個listen()方法
Httpserver.listen(8000)
此處的listen()方法和1中的listen不是同一個, 注意區分
3. Tornado的單進程與多進程:
以上啓動的服務都是單進程下運行的, 如何啓動多進程?
obj = tornado.web.Application([(路由映射關係), ...])
httpserver = tornado.httpserver.HTTPServer( obj ) # 把httpserve和Application關聯, 以便能讀到配置的路由
httpserver.bind(8000) # 此處不用listen方法了,注意
Httpserver.start(5) # 開啓指定數量進程. 不指定時默認開啓1個進程; 0,負數,None時都開啓cpu核數進程
注意: 1中截圖內的app.listen()方法只能在但進程模式中使用
3中啓動多進程的方式有些問題, 不建議使用. 問題有:(1)啓動的5個進程都屬於子進程, 會從父進程
中各自複製一份IOLoop,如在建立子進程前修改了IOLoop,會影響全部子進程; (2)全部進程都是由
一個命令啓動的, 沒法作到在不中止服務的狀況下修改代碼. (3)全部進程共享一個端口, 想要分別
監控很困難.