2015-04-17 30 views
8

Python'da çok işlemli bir programla çalışıyorum. Alt süreç içinde liste paylaşmak için multiprocessing.Manager().list() kullanıyorum. İlk önce, ana süreçte bazı görevler ekliyorum. Ve sonra, bazı alt işlemlerin, paylaşılan listedeki alt işlemlerin de paylaşılan listeye görevler ekleyen görevleri yapmak için başlatın. Ama aşağıdaki gibi bir istisna var:python çoklu işlem yöneticisi listesi hatası: [Errno 2] Böyle bir dosya veya dizin yok

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 

Ben this gibi piton çoklu işlem paylaşılan listeyi nasıl kullanılacağı hakkında bir şeyler bulabilirsiniz. Ama yine de bazı istisnalar var. İstisnenin anlamı hakkında hiçbir fikrim yok. Ve ortak liste ile manager.list arasındaki fark nedir? aşağıdaki gibi

kodu:

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

Burada neyin yanlış gittiğini söylemek herkes için sorunu yeniden oluşturmak için yeterli kod paylaşmanız gerekmektedir. Kullanmaya çalışmadan önce yönetici kapatılmış gibi görünüyor, ancak herhangi bir kod görmeden söylemek zor. – dano

+0

Kod, UNIX yuvalarını kullanıyor ve soket dosyasına bağlanılamıyor gibi görünüyor. –

+0

@dano kodu [burada] (https://github.com/stamaimer/MrUirf/blob/master/twitter/gen_friendship.py) – stamaimer

cevap

14

sorun ana süreç kapanır Manager senin hangi, tüm alt işlemleri başlatmak hemen sonra çıkan olmasıdır. Manager sayfanız kapanıyorsa, çocuklardan hiçbiri onlara aktardığınız paylaşımlı listeyi kullanamaz. Tüm çocukların bitirmesini beklemek için join kullanarak düzeltebilirsiniz. Sadece join arayarak emin aslında start tüm süreçler öncesinde olun:

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

Evet, haklısınız. Çok teşekkür ederim. Ve neden sadece bir sürecin kaçtığını anladım. Daha önce 'katılma' anlamıyorum. – stamaimer

+0

Bu, bir milyon upvotes olmalıdır. Şimdi bir günlüğüne giderdiğim bir sorunu çözdü. Süreç boşaldı ve diğer süreçler kapatılırken süreçler başlatıldı. – mudda

İlgili konular