01-httpserver
修改上篇文章簡單tornado案例的代碼如下:
import tornado.web
import tornado.ioloop
import tornado.httpserver # 新引入httpserver模塊
class IndexHandler(tornado.web.RequestHandler):
"""主路由處理類"""
def get(self):
"""對應http的get請求方式"""
self.write("Hello Itcast!")
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服務器實現。
我們創建了一個HTTP服務器實例http_server,因爲服務器要服務於我們剛剛建立的web應用,將接收到的客戶端請求通過web應用中的路由映射表引導到對應的handler中,所以在構建http_server對象的時候需要傳出web應用對象app。http_server.listen(8000)將服務器綁定到8000端口。
實際上一版代碼中app.listen(8000)正是對這一過程的簡寫。
關於app.listen()
app.listen()這個方法只能在單進程模式中使用。
對於app.listen()與手動創建HTTPServer實例
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8000)
這兩種方式,建議大家先使用後者即創建HTTPServer實例的方式,因爲其對於理解tornado web應用工作流程的完整性有幫助,便於大家記憶tornado開發的模塊組成和程序結構;在熟練使用後,可以改爲簡寫。
02-單進程與多進程
修改上面httpserver版本代碼如下:
import tornado.web
import tornado.ioloop
import tornado.httpserver
class IndexHandler(tornado.web.RequestHandler):
"""主路由處理類"""
def get(self):
"""對應http的get請求方式"""
self.write("Hello Itcast!")
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)方法是將服務器綁定到指定端口。
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)
03-關於多進程
雖然tornado給我們提供了一次開啓多個進程的方法,但是由於:
每個子進程都會從父進程中複製一份IOLoop實例,如果在創建子進程前我們的代碼動了IOLoop實例,那麼會影響到每一個子進程,勢必會干擾到子進程IOLoop的工作;
所有進程是由一個命令一次開啓的,也就無法做到在不停服務的情況下更新代碼;
所有進程共享同一個端口,想要分別單獨監控每一個進程就很困難。
不建議使用這種多進程的方式,而是建議手動開啓多個進程,並且綁定不同的端口。