2012-08-14 20 views
8

Tôi cần chia sẻ một đối tượng và các phương thức của nó giữa một số quy trình trong python. Tôi đang cố gắng sử dụng quản lý (trong đa xử lý mô-đun) nhưng nó bị treo. Đây là một ví dụ ngớ ngẩn của người tiêu dùng sản xuất khi đối tượng được chia sẻ giữa hai quy trình chỉ là một danh sách các số có bốn phương pháp.Chia sẻ đối tượng (lớp thể hiện) trong python bằng cách sử dụng các trình quản lý

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

Dù sao nó luôn luôn bị treo như thế, tôi biết điều này:

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 

Vì vậy, có chuyện gì vậy? Tôi nên sử dụng những Người quản lý này để chia sẻ các đối tượng và phương pháp của họ như thế nào?

Trả lời

5

Bạn phải join quy trình của mình để ngăn chặn quá trình thoát ra chính trước khi quá trình con tiếp tục thực thi. Vì vậy, hãy thêm tham gia vào mã của bạn:

consumer.join() 
producer.join() 

sau khi bạn gọi là start() các phương pháp của quy trình của bạn.

Các vấn đề liên quan