Tornado框架02-創建服務器與多進程

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的工作;

  • 所有進程是由一個命令一次開啓的,也就無法做到在不停服務的情況下更新代碼;

  • 所有進程共享同一個端口,想要分別單獨監控每一個進程就很困難。

不建議使用這種多進程的方式,而是建議手動開啓多個進程,並且綁定不同的端口。

發佈了48 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章