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?