2014-09-02 117 views
0

我有兩臺機器,現在孩子正在做一段時間1:語句來不斷檢查包含作業的BaseManager。這使得它很健談。有一個更好的方法嗎?在多處理器上添加事件監聽器。管理器

你可以在經理上創建一個事件,說:「嘿,我有一個新的工作的孩子!」就像在C#中一樣,你可以使用+ =和 - =語法連接一個新事件?

很簡單的孩子是這樣的:

class QueueManager(BaseManager): 
""" multiprocessing queue manager object """ 
    pass 
if __name__ == "__main__": 
    # get the get function 
    QueueManager.register('get_queue') 
    while 1: 
     queue = m.get_queue() 
     if queue.empty() == False and \ 
      queue.qsize() > 0: 
      job_directory = queue.get() 
      print job_directory 

所有我做它從隊列中拉出作業文件夾。我想要一個更好的方式來做到這一點。事件可以通過連線完成嗎?

謝謝

回答

2

這裏不需要繁忙的循環。只需致電get_queue一次,while循環的外面,然後直接使用queue.get()內循環:

class QueueManager(BaseManager): 
""" multiprocessing queue manager object """ 
    pass 

if __name__ == "__main__": 
    QueueManager.register('get_queue') 
    queue = m.get_queue() 
    while 1: 
     job_directory = queue.get() 
     print job_directory 

經理返回一個Proxy到您的服務器上創建的Queue.Queue()對象,而不是實際的Queue.Queue副本目的。您在Proxy上執行的每項操作都會傳遞到服務器上的Queue.Queue實例,因此您可以像使用正常的Queue那樣使用它。從客戶的角度來看,BaseManager子類返回的共享Queue實例與普通的Queue.Queue沒有區別。

+0

所以推薦的模式是總是使用while模式? – 2014-09-02 23:26:27

+0

@ josh1234是的。因爲我們現在直接去'queue.get()',使用'while 1:'模式不是很「健談」。循環將在'get()'調用中阻塞,直到'queue'中實際存在一個消耗的項目。然後它會處理它,然後回到阻塞狀態。 – dano 2014-09-02 23:28:16