最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

13.5 分布式進程

2021-09-29 08:31 作者:海鷗之道  | 我要投稿

在Thread和Process中,應當優(yōu)選Process,因為Process更穩(wěn)定,而且,Process可以分布到多臺機器上,而Thread最多只能分布到同一臺機器的多個CPU上。

Python的multiprocessing模塊不但支持多進程,其中managers子模塊還支持把多進程分布到多臺機器上。一個服務進程可以作為調度者,將任務分布到其他多個進程中,依靠網絡通信。由于managers模塊封裝很好,不必了解網絡通信的細節(jié),就可以很容易地編寫分布式多進程程序。

舉個例子:如果我們已經有一個通過Queue通信的多進程程序在同一臺機器上運行,現(xiàn)在,由于處理任務的進程任務繁重,希望把發(fā)送任務的進程和處理任務的進程分布到兩臺機器上。怎么用分布式進程實現(xiàn)?

原有的Queue可以繼續(xù)使用,但是,通過managers模塊把Queue通過網絡暴露出去,就可以讓其他機器的進程訪問Queue了。

我們先看服務進程,服務進程負責啟動Queue,把Queue注冊到網絡上,然后往Queue里面寫入任務:

請注意,當我們在一臺機器上寫多進程程序時,創(chuàng)建的Queue可以直接拿來用,但是,在分布式多進程環(huán)境下,添加任務到Queue不可以直接對原始的task_queue進行操作,那樣就繞過了QueueManager的封裝,必須通過manager.get_task_queue()獲得的Queue接口添加。

然后,在另一臺機器上啟動任務進程(本機上啟動也可以):

任務進程要通過網絡連接到服務進程,所以要指定服務進程的IP。

現(xiàn)在,可以試試分布式進程的工作效果了。先啟動task_master.py服務進程:

task_master.py進程發(fā)送完任務后,開始等待result隊列的結果?,F(xiàn)在啟動task_worker.py進程:

task_worker.py進程結束,在task_master.py進程中會繼續(xù)打印出結果:

這個簡單的Master/Worker模型有什么用?其實這就是一個簡單但真正的分布式計算,把代碼稍加改造,啟動多個worker,就可以把任務分布到幾臺甚至幾十臺機器上,比如把計算n*n的代碼換成發(fā)送郵件,就實現(xiàn)了郵件隊列的異步發(fā)送。

Queue對象存儲在哪?注意到task_worker.py中根本沒有創(chuàng)建Queue的代碼,所以,Queue對象存儲在task_master.py進程中:

Queue之所以能通過網絡訪問,就是通過QueueManager實現(xiàn)的。由于QueueManager管理的不止一個Queue,所以,要給每個Queue的網絡調用接口起個名字,比如get_task_queue。

authkey有什么用?這是為了保證兩臺機器正常通信,不被其他機器惡意干擾。如果task_worker.pyauthkeytask_master.pyauthkey不一致,肯定連接不上。

小結

Python的分布式進程接口簡單,封裝良好,適合需要把繁重任務分布到多臺機器的環(huán)境下。

注意Queue的作用是用來傳遞任務和接收結果,每個任務的描述數據量要盡量小。比如發(fā)送一個處理日志文件的任務,就不要發(fā)送幾百兆的日志文件本身,而是發(fā)送日志文件存放的完整路徑,由Worker進程再去共享的磁盤上讀取文件。


13.5 分布式進程的評論 (共 條)

分享到微博請遵守國家法律
通海县| 都昌县| 兴业县| 自贡市| 黎城县| 乌兰浩特市| 安西县| 易门县| 柳河县| 克什克腾旗| 新乐市| 鄂温| 壤塘县| 确山县| 清流县| 德庆县| 平阴县| 永福县| 长沙县| 梨树县| 工布江达县| 雷州市| 呼和浩特市| 上林县| 和龙市| 锡林浩特市| 伊吾县| 桐柏县| 西城区| 荆门市| 邢台县| 旺苍县| 正镶白旗| 遂宁市| 石棉县| 任丘市| 台前县| 吴旗县| 涞源县| 宝丰县| 会宁县|