使用多处理管理器共享对象(类实例) [英] Sharing object (class instance) using multiprocessing Managers
问题描述
我需要在 python 中的多个进程之间共享一个对象及其方法.我正在尝试使用 managers
(在 multiprocessing
模块中),但它崩溃了.这是一个生产者-消费者的愚蠢示例,其中两个进程之间的共享对象只是一个包含四种方法的数字列表.
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
那到底是怎么回事?我应该如何使用这些 managers
来共享对象及其方法?
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.
这篇关于使用多处理管理器共享对象(类实例)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!