tornado httpserver

# 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)

說明

1.關於app.listen()

app.listen()這個方法只能在單進程模式中使用。對象

對於app.listen()與手動建立HTTPServer實例blog

http_server = tornado.httpserver.HTTPServer(app) 
http_server.listen(8000)

2.關於多進程

雖然tornado給咱們提供了一次開啓多個進程的方法,可是因爲:

  • 每一個子進程都會從父進程中複製一份IOLoop實例,如過在建立子進程前咱們的代碼動了IOLoop實例,那麼會影響到每個子進程,勢必會干擾到子進程IOLoop的工做;
  • 全部進程是由一個命令一次開啓的,也就沒法作到在不停服務的狀況下更新代碼;
  • 全部進程共享同一個端口,想要分別單獨監控每個進程就很困難。

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

相關文章
相關標籤/搜索