使用多处理管理器共享对象(类实例) [英] Sharing object (class instance) using multiprocessing Managers

查看:58
本文介绍了使用多处理管理器共享对象(类实例)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆