Tornado—三種啟動tornado的方式


第一種啟動方式:單進程

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

https://blog.csdn.net/fenglei0415/article/details/84029012

https://blog.csdn.net/u014252563/article/details/51532284


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM