2012-08-14 6 views
8

私はオブジェクトとそのメソッドをいくつかのプロセス間でPythonで共有する必要があります。私はマネージャ(モジュールのマルチプロセッシングで)を使用しようとしていますが、クラッシュします。ここでは、プロデューサ - コンシューマの愚かな例を示します。ここでは、2つのプロセス間の共有オブジェクトは、4つのメソッドを持つ数字のリストに過ぎません。マネージャーを使ってPythonでオブジェクト(クラスインスタンス)を共有する

from multiprocessing import Process, Condition, Lock 
from multiprocessing.managers import BaseManager 
import time, os 

lock = Lock() 
waitC = Condition(lock) 
waitP = Condition(lock) 

class numeri(object): 
    def __init__(self): 
     self.nl = [] 

    def getLen(self): 
     return len(self.nl) 

    def stampa(self): 
     print self.nl 

    def appendi(self, x): 
     self.nl.append(x) 

    def svuota(self): 
     for i in range(len(self.nl)): 
      del self.nl[0] 

class numManager(BaseManager): 
    pass 

numManager.register('numeri', numeri, exposed = ['getLen', 'appendi', 'svuota', 'stampa']) 

def consume(waitC, waitP, listaNumeri): 
    lock.acquire() 
    if (listaNumeri.getLen() == 0): 
     waitC.wait() 
    listaNumeri.stampa() 
    listaNumeri.svuota() 
    waitP.notify() 
    lock.release() 

def produce(waitC, waitP, listaNumeri): 
    lock.acquire() 
    if (listaNumeri.getLen() > 0): 
     waitP.wait() 
    for i in range(10): 
     listaNumeri.appendi(i) 
    waitC.notify() 
    lock.release() 


def main(): 
    mymanager = numManager() 
    mymanager.start() 
    listaNumeri = mymanager.numeri() 
    producer = Process(target = produce, args =(waitC, waitP, listaNumeri,)) 
    producer.start() 
    time.sleep(2) 
    consumer = Process(target = consume, args =(waitC, waitP, listaNumeri,)) 
    consumer.start() 

main() 

とにかくそれはいつも私にこれを言って、そのようにクラッシュ:

Process Process-3: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "./trySemProc.py", line 61, in consume 
    if (listaNumeri.getLen() == 0): 
    File "<string>", line 2, in getLen 
    File "/usr/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod 
    self._connect() 
    File "/usr/lib/python2.7/multiprocessing/managers.py", line 742, in _connect 
    conn = self._Client(self._token.address, authkey=self._authkey) 
    File "/usr/lib/python2.7/multiprocessing/connection.py", line 169, in Client 
    c = SocketClient(address) 
    File "/usr/lib/python2.7/multiprocessing/connection.py", line 293, in SocketClient 
    s.connect(address) 
    File "/usr/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
error: [Errno 2] No such file or directory 

だから、問題は何ですか?オブジェクトとその方法を共有するためにこれらのマネージャをどのように使用する必要がありますか?

答えて

5

子プロセスが実行を続行する前にメインプロセスが終了しないように、プロセスはjoinにする必要があります。だから、追加は、あなたのコードに参加する:

consumer.join() 
producer.join() 

あなたのプロセスのstart()メソッドを呼び出した後。

関連する問題