# coding:utf-8 import tornado.web import tornado.ioloop import tornado.httpserver # 新引入httpserver模塊 class IndexHandler(tornado.web.RequestHandler): """主路由處理類""" def get(self): """對應http的get請求方式""" self.write("Hello ") if __name__ == "__main__": app = tornado.web.Application([ (r"/", IndexHandler), ]) # ------------------------------ # 咱們修改這個部分 # app.listen(8000) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8000) # ------------------------------ tornado.ioloop.IOLoop.current().start()
在這一修改版本中,咱們引入了tornado.httpserver模塊,顧名思義,它就是tornado的HTTP服務器實現。web
咱們建立了一個HTTP服務器實例http_server,由於服務器要服務於咱們剛剛創建的web應用,將接收到的客戶端請求經過web應用中的路由映射表引導到對應的handler中,因此在構建http_server對象的時候須要傳出web應用對象app。http_server.listen(8000)將服務器綁定到8000端口。服務器
實際上一版代碼中app.listen(8000)正是對這一過程的簡寫。app
咱們也能夠一次啓動多個進程,修改上面的代碼以下:tornado
# coding:utf-8 import tornado.web import tornado.ioloop import tornado.httpserver class IndexHandler(tornado.web.RequestHandler): """主路由處理類""" def get(self): """對應http的get請求方式""" self.write("Hello ") if __name__ == "__main__": app = tornado.web.Application([ (r"/", IndexHandler), ]) http_server = tornado.httpserver.HTTPServer(app) # -----------修改---------------- http_server.bind(8000) http_server.start(0) # ------------------------------ tornado.ioloop.IOLoop.current().start()
http_server.bind(port)方法是將服務器綁定到指定端口。oop
http_server.start(num_processes=1)方法指定開啓幾個進程,參數num_processes默認值爲1,即默認僅開啓一個進程;若是num_processes爲None或者<=0,則自動根據機器硬件的cpu核芯數建立同等數目的子進程;若是num_processes>0,則建立num_processes個子進程。spa
本例中,咱們使用http_server.start(0),而個人虛擬機設定cpu核數爲2,演示結果:code
咱們在前面寫的http_server.listen(8000)實際上就等同於:server
http_server.bind(8000)
http_server.start(1)
app.listen()這個方法只能在單進程模式中使用。對象
對於app.listen()與手動建立HTTPServer實例blog
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8000)
雖然tornado給咱們提供了一次開啓多個進程的方法,可是因爲:
不建議使用這種多進程的方式,而是手動開啓多個進程,而且綁定不一樣的端口。