第一種啟動方式:單進程
import tornado.web # web服務 import tornado.ioloop # I/O 時間循環 class Mainhandler(tornado.web.RequestHandler): def get(self): self.write("hello world!") # 建立路由表 app = tornado.web.Application([ (r"/index", Mainhandler), ]) if __name__ == "__main__": app.listen(8000) # 監聽端口 # tornado.ioloop.IOLoop.current().start() tornado.ioloop.IOLoop.instance().start() # 開始事件
app.listen()這個方法只能在單進程模式中使用。
對於app.listen()與方式二中的手動創建HTTPServer實例這兩種方式,建議大家先使用后者即創建HTTPServer實例的方式,因為其對於理解tornado web應用工作流程的完整性有幫助,便於大家記憶tornado開發的模塊組成和程序結構;在熟練使用后,可以改為簡寫。
第二種啟動方式:單進程
import tornado.web # web服務 import tornado.ioloop # I/O 時間循環 import tornado.httpserver # 新引入httpserver模塊,單線程的http服務 class Mainhandler(tornado.web.RequestHandler): def get(self): self.write("hello world!") # 建立路由表 app = tornado.web.Application([ (r"/index", Mainhandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8000) # tornado.ioloop.IOLoop.current().start() tornado.ioloop.IOLoop.instance().start() # 開始事件
在這一修改版本中,我們引入了tornado.httpserver模塊,顧名思義,它就是tornado的HTTP服務器實現。
我們創建了一個HTTP服務器實例http_server,因為服務器要服務於我們剛剛建立的web應用,將接收到的客戶端請求通過web應用中的路由映射表引導到對應的handler中,所以在構建http_server對象的時候需要傳出web應用對象app。http_server.listen(8000)將服務器綁定到8000端口。
實際上一版代碼中app.listen(8000)正是對這一過程的簡寫。
第二種啟動方式:多進程
import tornado.web # web服務 import tornado.ioloop # I/O 時間循環 import tornado.httpserver # 新引入httpserver模塊,單線程的http服務 class Mainhandler(tornado.web.RequestHandler): def get(self): self.write("hello world!") # 建立路由表 app = tornado.web.Application([ (r"/index", Mainhandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(app) http_server.bind(8000) http_server.start(3) # tornado.ioloop.IOLoop.current().start() tornado.ioloop.IOLoop.instance().start() # 開始事件
http_server.bind(port)方法是將服務器綁定到指定端口。
http_server.start(num_processes=1)方法指定開啟幾個進程,參數num_processes默認值為1,即默認僅開啟一個進程;如果num_processes為None或者<=0,則自動根據機器硬件的cpu核芯數創建同等數目的子進程;如果num_processes>0,則創建num_processes個子進程。
前面寫的http_server.listen(8000)實際上就等同於:http_server.bind(8000) http_server.start(1)這兩行代碼。
第三種啟動方式:多進程
import tornado.web # web服務 import tornado.ioloop # I/O 時間循環 import tornado.httpserver # 新引入httpserver模塊,單線程的http服務 class Mainhandler(tornado.web.RequestHandler): def get(self): self.write("hello world!") # 建立路由表 app = tornado.web.Application([ (r"/index", Mainhandler), ]) if __name__ == "__main__": sockets = tornado.netutil.bind_sockets(8888) tornado.process.fork_processes(0) # 10 http_server = tornado.httpserver.HTTPServer(app) http_server.add_sockets(sockets) # tornado.ioloop.IOLoop.current().start() tornado.ioloop.IOLoop.instance().start() # 開始事件
https://www.jianshu.com/p/41de38591e19