下面是一個簡單的方法來做到這一點。
創建工作做的一個共同的共享隊列。這個應用程序 將填補工作要做的工作。
創建一個應用程序,從隊列中獲取一個項目並完成工作。
這是單生產者多用戶設計。它運行良好,可以用並行進程淹沒你的機器。
要使用內置隊列類,您需要將隊列包裝在某種 多處理API中。 http://docs.python.org/library/queue.html。就我個人而言,我喜歡創建一個處理隊列的基於HTTP的小型Web服務器。每個應用程序都會執行 GET來獲取下一項工作。
您可以使用像RabbitMQ這樣的工具來創建一個非常漂亮的共享隊列。 http://nathanborror.com/posts/2009/may/20/working-django-and-rabbitmq/
您可能可以使用http://hjb.python-hosting.com/來使用JMS隊列。
您需要一個小應用程序來創建和填充工作隊列。
根據需要創建儘可能多的應用程序副本。例如:
for i in 1 2 3 4 5 6 7 8 9 10
do
python myapp.py &
done
這將運行10個併發副本的應用程序。所有10個人都試圖從一個隊列中獲得工作。他們將使用所有可用的CPU資源,操作系統將很好地爲你安排它們。
對等節點到節點同步意味着您在所有節點之間都有O(n *(n-1)/ 2)個通信路徑。
「兩個相鄰節點」意味着你仍然有2 * n個通信路徑,並且工作必須「以某種方式」在節點之間流動。如果節點最初都是在工作中播種,那麼有人做了很多計劃來平衡工作量。如果你打算做這麼多規劃,爲什麼要求節點同步呢?
如果隊列沒有仔細平衡開始,那麼每個偶數節點可能會變慢。每個奇怪的節點可能會很快。奇數節點首先完成,檢查來自兩個偶數節點的工作,並且這些節點(a)沒有完成,並且(b)沒有更多的工作要做。現在怎麼辦?一半節點正在工作,一半正在閒置。所有這些都是由於在最初的工作分配中計劃不周。
主從表示您有n條通信路徑。此外,由於所有空閒節點都有相同的工作權限,因此平衡是自動的。不存在導致整體績效不佳的偏向初始分配的情況。
謝謝你,這是類似程序的當前設計,但他們希望有到節點結構的,而非主從結構的節點。還有,從多個進程訪問多次的單個隊列會在羣集上造成可能的瓶頸? – patemotter 2010-07-23 19:44:16
@DistortedLojik:單個隊列不應該是一個問題,除非每個工作包都是微小的。這是純粹的開銷,因此您希望將隊列訪問的成本分攤到許多高價值工作上。 – 2010-07-23 19:47:43