您好,登錄后才能下訂單哦!
這篇文章主要講解了“python tornado開啟多進程的方法有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python tornado開啟多進程的方法有哪些”吧!
import tornado.httpserver import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") if __name__ == "__main__": app = tornado.web.Application([(r"/", MainHandler)]) server = tornado.httpserver.HTTPServer(app) server.bind(8888) server.start(0) # 0 表示啟動與CPU數量相同的進程 tornado.ioloop.IOLoop.current().start()
import tornado.httpserver import tornado.ioloop import tornado.web import tornado.process class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") if __name__ == "__main__": app = tornado.web.Application([(r"/", MainHandler)]) server = tornado.httpserver.HTTPServer(app) server.bind(8888) tornado.process.fork_processes(2) #
tornado.process.fork_processes(2) 表示啟動2個進程,每個進程都會調用 server.start(0) 來啟動Tornado實例。注意:在使用 tornado.process.fork_processes() 啟動多進程時,需要在 if __name__ == "__main__": 中調用該方法,否則會出現錯誤。
完整代碼如下:
import tornado.httpserver import tornado.ioloop import tornado.web import tornado.process class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") if __name__ == "__main__": app = tornado.web.Application([(r"/", MainHandler)]) server = tornado.httpserver.HTTPServer(app) server.bind(8888) tornado.process.fork_processes(2) server.start(0) tornado.ioloop.IOLoop.current().start()
除了以上提到的方式,還可以使用Python標準庫中的multiprocessing模塊來啟動多個Tornado進程,具體實現可以參考以下示例代碼:
import tornado.httpserver import tornado.ioloop import tornado.web from multiprocessing import Process class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def start_tornado(): app = tornado.web.Application([(r"/", MainHandler)]) server = tornado.httpserver.HTTPServer(app) server.listen(8888) tornado.ioloop.IOLoop.current().start() if __name__ == "__main__": processes = [] for i in range(2): p = Process(target=start_tornado) p.start() processes.append(p) for p in processes: p.join()
這段代碼會啟動兩個Tornado進程,每個進程都會監聽8888端口,并使用單獨的進程處理請求。
還有一個方式是使用第三方模塊gevent來實現協程并發,配合Tornado使用可以達到類似多進程的效果,但是只使用一個進程。示例代碼如下:
import gevent.monkey gevent.monkey.patch_all() import tornado.httpserver import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") if __name__ == "__main__": app = tornado.web.Application([(r"/", MainHandler)]) server = tornado.httpserver.HTTPServer(app) server.bind(8888) server.start(0) # 0 表示啟動與CPU數量相同的進程 tornado.ioloop.IOLoop.current().start()
在上面的代碼中,我們引入了gevent.monkey模塊,使用patch_all()方法將所有的阻塞式IO替換為非阻塞式IO,然后在啟動Tornado時,使用server.start(0)方法啟動與CPU數量
listen:單進程:
async def main(): server = HTTPServer() server.listen(8888) await asyncio.Event.wait() asyncio.run(main())
在許多情況下,tornado.web.Application.listen可用于避免明確創建HTTPServer的需要。
雖然此示例不會單獨創建多個進程,但當thereusereuse_port=True參數傳遞給listen()時,您可以多次運行程序以創建多進程服務。
add_sockets:多過程:
sockets = bind_sockets(8888) tornado.process.fork_processes(0) async def post_fork_main(): server = HTTPServer() server.add_sockets(sockets) await asyncio.Event().wait() asyncio.run(post_fork_main())
add_sockets接口更復雜,但它可以與tornado.process.fork_processes一起使用,以運行從單父分支的所有工作進程的多進程服務。如果您想以bind_sockets以外的某種方式創建監聽套接字,add_sockets也可以在單進程服務器中使用。
請注意,使用此模式時,觸及事件循環的任何東西都不能在fork_processes之前運行。
bind/start:簡單不建議使用的多進程:
server = HTTPServer() server.bind(8888) server.start(0) # Forks multiple sub-processes IOLoop.current().start()
此模式被棄用,因為它需要自Python 3.10以來被棄用的asyncio模塊中的接口。在start方法中創建多個進程的支持將在的未來版本中刪除。
此模式就是文中所說的第一種模式,單從官方文檔來看,這種方式已經被拋棄,本人在實測中也發現存在問題:無法完全關閉fork的子進程。
使用supervisor等進程管理工具來管理多個Tornado進程,這種方式可以更加方便地監控和管理多個進程,不過需要額外的配置和安裝進程管理工具。
感謝各位的閱讀,以上就是“python tornado開啟多進程的方法有哪些”的內容了,經過本文的學習后,相信大家對python tornado開啟多進程的方法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。