2015-04-17 44 views
8

我在Python中使用多處理程序。我使用multiprocessing.Manager().list()在子流程中共享列表。首先,我在主要過程中添加一些任務。然後,啓動一些子進程來執行共享列表中的任務,這些子進程還將任務添加到共享列表中。但我有一個例外如下:python多處理器管理器列表錯誤:[錯誤2]沒有這樣的文件或目錄

Traceback (most recent call last): 
     File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap 
     self.run() 
     File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run 
     self._target(*self._args, **self._kwargs) 
     File "gen_friendship.py", line 255, in worker 
     if tmpu in nodes: 
     File "<string>", line 2, in __contains__ 
     File "/usr/lib64/python2.6/multiprocessing/managers.py", line 722, in _callmethod 
     self._connect() 
     File "/usr/lib64/python2.6/multiprocessing/managers.py", line 709, in _connect 
     conn = self._Client(self._token.address, authkey=self._authkey) 
     File "/usr/lib64/python2.6/multiprocessing/connection.py", line 143, in Client 
     c = SocketClient(address) 
     File "/usr/lib64/python2.6/multiprocessing/connection.py", line 263, in SocketClient 
     s.connect(address) 
     File "<string>", line 1, in connect 
    error: [Errno 2] No such file or directory 

我找到一些有關如何使用共享列表蟒蛇多像this。但仍然有一些例外。我不知道例外的意義。常用列表和manager.list之間有什麼區別?

的代碼如下:

nodes = multiprocessing.Manager().list() 

    lock = multiprocessing.Lock() 

    AMOUNT_OF_PROCESS = 10 

    def worker(): 
     lock.acquire() 
     nodes.append(node) 
     lock.release() 

    if __name__ == "__main__": 

     for i in range(i): 
      nodes.append({"name":"username", "group":1}) 

     processes = [None for i in range(AMOUNT_OF_PROCESS)] 

     for i in range(AMOUNT_OF_PROCESS): 
      processes[i] = multiprocessing.Process(taget=worker, args=()) 
      processes[i].start() 
+1

你需要共享足夠的代碼重現該問題對任何人告訴你什麼地方錯在這裏。在嘗試使用它之前,它看起來可能是經理關閉了,但是很難說沒有看到任何代碼。 – dano

+0

看起來代碼使用的是UNIX套接字,並且無法綁定到套接字文件。 –

+0

@dano代碼在[這裏](https://github.com/stamaimer/MrUirf/blob/master/twitter/gen_friendship.py) – stamaimer

回答

14

的問題是,你的主進程退出後立即啓動您的所有工作流程,這將關閉你的Manager。當您的Manager關閉時,所有孩子都不能使用您傳遞給他們的共享列表。您可以使用join來修復它,以等待所有孩子完成。只要確保你真正start所有的進程在調用join

for i in range(AMOUNT_OF_PROCESS): 
    processes[i] = multiprocessing.Process(taget=worker, args=()) 
    processes[i].start() 
for process in processes: 
    process.join() 
+0

是的,你是對的。非常感謝你。我已經找出爲什麼只有一個進程運行。我不明白'加入'之前。 – stamaimer

+0

這應該有百萬upvotes。它解決了我現在正在排除故障的一個問題。當隊列被清空並且其他進程正在關閉時,進程正在啓動。 – mudda

相關問題