91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python?tornado開啟多進程的方法有哪些

發布時間:2023-04-17 17:13:24 來源:億速云 閱讀:223 作者:iii 欄目:開發技術

這篇文章主要講解了“python tornado開啟多進程的方法有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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數量相同的進程
    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__": 中調用該方法,否則會出現錯誤。

完整代碼如下:

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進程,具體實現可以參考以下示例代碼:

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端口,并使用單獨的進程處理請求。

4.使用第三方模塊gevent

還有一個方式是使用第三方模塊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數量

5.使用官方提供方式

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的子進程。

6.使用supervisor

使用supervisor等進程管理工具來管理多個Tornado進程,這種方式可以更加方便地監控和管理多個進程,不過需要額外的配置和安裝進程管理工具。

感謝各位的閱讀,以上就是“python tornado開啟多進程的方法有哪些”的內容了,經過本文的學習后,相信大家對python tornado開啟多進程的方法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泊头市| 水城县| 东源县| 临朐县| 大港区| 苏尼特左旗| 洪泽县| 古交市| 六盘水市| 济宁市| 普兰店市| 青川县| 鲜城| 吴川市| 高阳县| 公安县| 金塔县| 五河县| 仪陇县| 绥阳县| 榆中县| 台湾省| 综艺| 延边| 定日县| 兴仁县| 辰溪县| 永川市| 天门市| 嘉兴市| 报价| 拜城县| 璧山县| 九江市| 江源县| 洛南县| 奉节县| 武强县| 宣威市| 土默特右旗| 石林|