2013-07-08 64 views
0

我要使用遠程管理功能multiprocessing模塊中分配多臺機器中的工作。我知道有第三方模塊,但我想盡可能堅持使用核心。我知道桌面(單機),您可以使用multiprocessing.Pool類來限制CPU的數量,但是與遠程管理員有幾個問題。Python中,使用遠程管理和多

我對遠程管理器下面的代碼:

from multiprocessing.managers import BaseManager 
    import Queue 
    queue = Queue.Queue() 
    class QueueManager(BaseManager): pass 
    QueueManager.register('get_queue', callable=lambda:queue) 
    m = QueueManager(address=('', 50000), authkey='abracadabra') 
    s = m.get_server() 
    s.serve_forever() 

這個偉大的工程,我甚至可以使用下面的代碼提交作業到隊列:

QueueManager.register('get_queue') 
m = QueueManager(address=('machinename', 50000), authkey='abracadabra') 
m.connect() 
queue = m.get_queue() 
queue.put('hello')QueueManager.register('get_queue') 
m = QueueManager(address=('localhost', 50000), authkey='abracadabra') 
m.connect() 
queue = m.get_queue() 
queue.put('hello') 

你也可以queue.get()在隊列中獲得單個條目。

  1. 你如何在隊列中的項目?當我嘗試迭代隊列時,我輸入一個無限循環。
  2. 在工人身上,你能限制每臺機器每臺機器1臺作業嗎?
  3. 因爲這種方法似乎是拉法,那裏的工作人員需要檢查,如果一個任務中存在,纔會有一個推方法,其中多服務器可以被觸發?

回答

1

遍歷隊列是一樣的做:

while True: 
    elem = queue.get() #queue empty -> it blocks!!! 

一種優雅的方式,以「迭代」在隊列並阻止你的工作進程時,有沒有更多的就業機會,以執行是使用None(或別的東西)作爲定點和使用iter(callable, sentinel)

for job in iter(queue.get, None): 
    # execute the calculation 
    output_queue.put(result) 

#shutdown the worker process 

即相當於:

while True: 
    job = queue.get() 
    if job is None: 
     break 
    #execute the calculation 
    output_queue.put(result) 
#shutdown the worker process 

請注意,您必須在queu中爲每個工作程序子進程插入一個標記,否則會有子進程在等待它。

關於你提到的第二個問題,我不明白你的要求。該BaseManager提供了執行客戶端調用一個服務器,所以,很明顯,所有的請求都通過同一臺機器滿足。 還是你的意思是允許每個客戶端只做一個請求?我沒有看到這方面的任何選擇,儘管它可以「手工」實現。

我不明白你的問題。 什麼就像一個拉方法?你可以用一些更詳細的信息來說明你的問題嗎?「多處理服務器可以觸發的推送方法」是什麼意思?

+0

謝謝你的迭代方法。 –

+0

所以我想我的問題是這樣的,比如說你有一個單獨的遠程管理員,總是運行,並且你有多個工作者。確保只有一臺工人機器完成一項工作的最佳方法是什麼?有沒有辦法將工作手動分配給工作機器?當一個工作機器使用get()函數提取作業時,是否將該作業從隊列中刪除? –

+0

@ josh1234一旦通過'get'獲得工作,其他進程就不會再收到它了。這正是隊列的目的:它會自動處理進程之間的同步,以避免相同的工作由多個工作人員執行。 – Bakuriu