python tornado開啟多進程的幾種方法
以下各種方式僅供參考,本人親測只有官方提供的方式比較靠譜。
1. 使用多個進程啟動多個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數(shù)量相同的進程
? ? tornado.ioloop.IOLoop.current().start()2. 使用tornado.process.fork_processes()方法啟動多個進程
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__": 中調用該方法,否則會出現(xiàn)錯誤。
完整代碼如下:
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()3.使用標準庫中的multiprocessing
除了以上提到的方式,還可以使用Python標準庫中的multiprocessing模塊來啟動多個Tornado進程,具體實現(xiàn)可以參考以下示例代碼:
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進程,每個進程都會監(jiān)聽8888端口,并使用單獨的進程處理請求。
4.使用第三方模塊gevent
還有一個方式是使用第三方模塊gevent來實現(xiàn)協(xié)程并發(fā),配合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數(shù)量相同的進程
? ? tornado.ioloop.IOLoop.current().start()在上面的代碼中,我們引入了gevent.monkey模塊,使用patch_all()方法將所有的阻塞式IO替換為非阻塞式IO,然后在啟動Tornado時,使用server.start(0)方法啟動與CPU數(shù)量
5.使用官方提供方式
listen:單進程:
async def main():
server = HTTPServer()
server.listen(8888)
await asyncio.Event.wait()
asyncio.run(main())在許多情況下,tornado.web.Application.listen可用于避免明確創(chuàng)建HTTPServer的需要。
雖然此示例不會單獨創(chuàng)建多個進程,但當thereusereuse_port=True參數(shù)傳遞給listen()時,您可以多次運行程序以創(chuàng)建多進程服務。
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以外的某種方式創(chuàng)建監(jiān)聽套接字,add_sockets也可以在單進程服務器中使用。
請注意,使用此模式時,觸及事件循環(huán)的任何東西都不能在fork_processes之前運行。
bind/start:簡單不建議使用的多進程:
server = HTTPServer()
server.bind(8888)
server.start(0) # Forks multiple sub-processes
IOLoop.current().start()
此模式被棄用,因為它需要自Python 3.10以來被棄用的asyncio模塊中的接口。在start方法中創(chuàng)建多個進程的支持將在的未來版本中刪除。
此模式就是文中所說的第一種模式,單從官方文檔來看,這種方式已經(jīng)被拋棄,本人在實測中也發(fā)現(xiàn)存在問題:無法完全關閉fork的子進程。
6.使用supervisor
使用supervisor等進程管理工具來管理多個Tornado進程,這種方式可以更加方便地監(jiān)控和管理多個進程,不過需要額外的配置和安裝進程管理工具。
到此這篇關于python tornado開啟多進程的幾種方法的文章就介紹到這了,更多相關python tornado多進程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python基于jieba分詞實現(xiàn)snownlp情感分析
情感分析(sentiment analysis)是2018年公布的計算機科學技術名詞,它可以根據(jù)文本內(nèi)容判斷出所代表的含義是積極的還是負面的等。本文將通過jieba分詞實現(xiàn)snownlp情感分析,感興趣的可以了解一下2023-01-01
Python基礎數(shù)據(jù)類型tuple元組的概念與用法
元組(tuple)是 Python 中另一個重要的序列結構,和列表類似,元組也是由一系列按特定順序排序的元素組成,這篇文章主要給大家介紹了關于Python基礎數(shù)據(jù)類型tuple元組的概念與使用方法,需要的朋友可以參考下2021-07-07
pandas數(shù)據(jù)清洗,排序,索引設置,數(shù)據(jù)選取方法
下面小編就為大家分享一篇pandas數(shù)據(jù)清洗,排序,索引設置,數(shù)據(jù)選取方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

