2012-08-14 2 views
8

파이썬에서 여러 프로세스간에 객체와 그 메소드를 공유해야합니다. (모듈 다중 처리에서) 관리자를 사용하려고하는데 충돌이 발생합니다. 다음은 두 프로세스 간의 공유 객체가 네 가지 메소드가있는 숫자 목록 일 뿐인 producer-consumer의 바보 같은 예입니다. 관리자를 사용하여 파이썬에서 객체 (클래스 인스턴스) 공유하기

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() 방법을 호출 한 후.

관련 문제