2012-08-14 96 views
8

我需要在Python中的幾個進程之間共享一個對象及其方法。我試圖使用管理器(模塊多處理),但它崩潰。這是生產者 - 消費者的一個愚蠢的例子,其中兩個進程之間的共享對象只是一個有四種方法的數字列表。在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()方法之後。