導航:首頁 > 編程語言 > python序列化分布式

python序列化分布式

發布時間:2025-04-02 02:47:45

1. python分布式進程中你會遇到的坑

寫在前面

小驚大怪

你是不是在用Python3或者在windows系統上編程?最重要的是你對進程和線程不是很清楚?那麼恭喜你,在python分布式進程中,會有坑等著你去挖。。。(hahahaha,此處允許我嚇唬一下你)開玩笑的啦,不過,如果你知道序列中不支持匿名函數,那這個坑就和你say byebye了。好了話不多數,直接進入正題。

分布式進程

正如大家所知道的Process比Thread更穩定,而且Process可以分布到多台機器上,而Thread最多隻能分布到同一陸坦咐台機器的多個CPU上。Python的multiprocessing模塊不但支持多進程,其中managers子模塊還支持把多進程分布到多台機器上。一個服務進程可以作為調度者,將任務分布到其他多個進程中,依靠網路通信。由於managers模塊封裝很好,不必了解網路通信的細節,就可以很容易地編寫分布式多進程程序。

代碼記錄

舉個例子

如果我們已經有一個通過Queue通信的多進程程序在同一台機器上運行,現在,由於處理任務的進程任務繁重,希望把發送任務的進程和處理任務的進程分布到兩台機器上,這應該怎麼用分布式進程來實現呢?你已經知道了原有的Queue可以繼續使用,而且通過managers模塊把Queue通過網路暴露出去,就可以讓其他機器的進程來訪問Queue了。好,那我們就這么干!

寫個task_master.py

我們先看服務進程。服務進程負責啟動Queue,把Queue注冊到網路上,然後往Queue裡面寫入任務。

請注意,當我們在一台機器上寫多進程程序時,創建的Queue可以直接拿來用,但是,在分布式多進程環境下,添加任務到Queue不可以直接對原始的task_queue進行操作,那樣就繞過了QueueManager的封裝,必須通過manager.get_task_queue()獲得的Queue介面添加。然後,在另一台機器上啟動任務進程(本機上啟動也可以)

寫個task_worker.py

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

運行結果

現在,可信沒以試試分布式進程的工作效果了。先啟動task_master.py服務進程:

task_master.py進程發送完任務後,開始等待result隊列的結果。現在啟動task_worker.py進程:

看到沒,結果都出錯了,我們好好分析一下到底哪出錯了。。。

錯誤分析

在task_master.py的報錯提示中,我們知道它說lambda錯誤,這是因為序列化不支持匿名函數,所以我們得修改代碼,重新對queue用QueueManager進行封裝放到網路中。

其中task_queue和result_queue是兩個隊列,分別存放任務和結果。它們用來進行進程間通信,交換對象。

因為是分布式的環境,放入queue中的數據需要等待Workers機器運算處理後再進行讀取,這樣就需要對queue用QueueManager進行封裝放到網路中,這是通過上面的2行代碼來實現的。我們給return_task_queue的網路調用介面取了一個名早純get_task_queue,而return_result_queue的名字是get_result_queue,方便區分對哪個queue進行操作。task.put(n)即是對task_queue進行寫入數據,相當於分配任務。而result.get()即是等待workers機器處理後返回的結果。

值得注意 在windows系統中你必須要寫IP地址,而其他操作系統比如linux操作系統則就不要了。

修改後的代碼

在task_master.py中修改如下:

在task_worker.py中修改如下:

先運行task_master.py,然後再運行task_worker.py

(1)task_master.py運行結果如下

(2)task_worker.py運行結果如下

知識補充

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

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

而Queue之所以能通過網路訪問,就是通過QueueManager實現的。由於QueueManager管理的不止一個Queue,所以,要給每個Queue的網路調用介面起個名字,比如get_task_queue。task_worker這里的QueueManager注冊的名字必須和task_manager中的一樣。對比上面的例子,可以看出Queue對象從另一個進程通過網路傳遞了過來。只不過這里的傳遞和網路通信由QueueManager完成。

authkey有什麼用?這是為了保證兩台機器正常通信,不被其他機器惡意干擾。如果task_worker.py的authkey和task_master.py的authkey不一致,肯定連接不上。

閱讀全文

與python序列化分布式相關的資料

熱點內容
mgliveapp怎麼鎖車 瀏覽:901
編程程序屬於什麼軟體 瀏覽:978
誰命令燒了阿房宮 瀏覽:893
精力跟不上程序員如何轉行 瀏覽:477
義隆單片機視頻 瀏覽:81
電腦中的文件夾英語怎麼說 瀏覽:188
javaruntimeformac 瀏覽:358
php獲取參數列表 瀏覽:980
程序員一般多少歲就迷茫了 瀏覽:467
文件夾磁碟滿了怎麼清理 瀏覽:333
方舟編譯器增加適配 瀏覽:420
晚上內網伺服器為什麼卡 瀏覽:736
app如何清除廣告 瀏覽:272
xp系統怎麼編譯 瀏覽:73
常用的時域基音檢測演算法有哪些 瀏覽:369
開機自啟samba服務命令 瀏覽:782
電容放電解壓版 瀏覽:810
java程序設計基礎第四版 瀏覽:373
方舟如何找自己玩過的伺服器手游 瀏覽:777
加密的方式選擇什麼呢 瀏覽:952