2012-08-14 28 views
8

Necesito compartir un objeto y sus métodos entre varios procesos en python. Intento utilizar Managers (en multiprocesamiento de módulos) pero se bloquea. Aquí hay un ejemplo tonto de productor-consumidor donde el objeto compartido entre los dos procesos es solo una lista de números con cuatro métodos.Objeto de intercambio (instancia de clase) en python usando Managers

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() 

De todos modos siempre se estrella como esa, me dice esto:

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 

Entonces, ¿cuál es el problema? ¿Cómo debería usar estos administradores para compartir objetos y sus métodos?

Respuesta

5

Debe join sus procesos para evitar que el proceso principal salga antes de que los procesos secundarios continúen su ejecución. Así que añadir une a su código:

consumer.join() 
producer.join() 

después de que llamó start() métodos de sus procesos.

Cuestiones relacionadas