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個進程,每個進程都會調(diào)用 server.start(0) 來啟動Tornado實例。注意:在使用 tornado.process.fork_processes() 啟動多進程時,需要在 if __name__ == "__main__": 中調(diào)用該方法,否則會出現(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)建多進程服務(wù)。
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一起使用,以運行從單父分支的所有工作進程的多進程服務(wù)。如果您想以bind_sockets以外的某種方式創(chuàng)建監(jiān)聽套接字,add_sockets也可以在單進程服務(wù)器中使用。
請注意,使用此模式時,觸及事件循環(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)存在問題:無法完全關(guān)閉fork的子進程。
6.使用supervisor
使用supervisor等進程管理工具來管理多個Tornado進程,這種方式可以更加方便地監(jiān)控和管理多個進程,不過需要額外的配置和安裝進程管理工具。
到此這篇關(guān)于python tornado開啟多進程的幾種方法的文章就介紹到這了,更多相關(guān)python tornado多進程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python和TFIDF實現(xiàn)提取文本中的關(guān)鍵詞
TFIDF 的工作原理是按比例增加一個詞語在文檔中出現(xiàn)的次數(shù),但會被它所在的文檔數(shù)量抵消。本文將利用TFIDF實現(xiàn)提取文本中的關(guān)鍵詞,感興趣的小伙伴快跟隨小編一起學習一下吧2022-04-04Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊列詳解(2)
這篇文章主要為大家詳細介紹了Python中的隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03如何通過python代碼根據(jù)模板修改變量生成新yaml文件
有些時候,需要根據(jù)一個yaml模板創(chuàng)建多個yaml文件實例,我們先寫一個yaml文件模板,然后通過python代碼修改模板中的變量,存儲為一個新的yaml文件,需要配合python的庫Template及ymal使用,本文給大家講解的非常詳細,需要的朋友跟隨小編一起看看吧2023-11-11tensorflow實現(xiàn)加載mnist數(shù)據(jù)集
這篇文章主要為大家詳細介紹了tensorflow實現(xiàn)加載mnist數(shù)據(jù)集,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09Python執(zhí)行系統(tǒng)命令的五種方式小結(jié)
在日常開發(fā)中,有時需要在Python腳本中執(zhí)行系統(tǒng)命令,Python有五種方式來執(zhí)行系統(tǒng)命令(推薦使用第五種),本文為大家整理了這五種方法的具體使用,希望對大家有所幫助2024-01-01tensorflow實現(xiàn)殘差網(wǎng)絡(luò)方式(mnist數(shù)據(jù)集)
這篇文章主要介紹了tensorflow實現(xiàn)殘差網(wǎng)絡(luò)方式(mnist數(shù)據(jù)集),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05