使用管理器在python中共享对象(类实例) [英] Sharing object (class instance) in python using Managers
问题描述
我需要在python的多个进程之间共享一个对象及其方法.我正在尝试使用Managers(在模块多处理中),但是它崩溃了.这是生产者-消费者的愚蠢示例,其中两个进程之间的共享对象只是具有四个方法的数字列表.
I need to share an object and its methods between several processes in python. I am trying to use Managers (in module multiprocessing) but it crashes. Here is a silly example of producer-consumer where the shared object between the two processes is just a list of numbers with four methods.
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()
无论如何,它总是像这样崩溃,告诉我:
Anyway it always crashes like that, telling me this:
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
那怎么了?我应该如何使用这些管理器共享对象及其方法?
So what's the matter? How should I use these Managers to share objects and their methods?
推荐答案
You must join your processes to prevent main process exiting before child processes continue their execution. So add joins to your code:
consumer.join()
producer.join()
在调用进程的start()
方法之后.
after you called start()
methods of your processes.
这篇关于使用管理器在python中共享对象(类实例)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!