使用管理器在python中共享对象(类实例) [英] Sharing object (class instance) in python using Managers

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

问题描述

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

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