如何在Python中继承“Manager().list”?

3

我已经实现了一个继承自列表的“DataSet”类,并且我需要将其代码转换为多进程模式运行。这是我的类的示例:

class DataSet(list):
    @property
    def n_training(self):
        return len(self) * 0.8
    @property
    def n_validation(self):
        return len(self) * 0.2

除了在这个类中创建一个“Manager().list”的实例外,还有更简单的方法吗?

from multiprocessing import Manager
class DataSet(Manager().list):

请注意,“Manager().list”是以下内容的表示:
manager = Manager()
manager.list()

Manager 指的是 multiprocessing.Manager 吗? - Gareth Latty
1
@JessadaThutkawkorapin:不,我认为这并不常见。而且SyncManager.register()类方法没有文档记录,因此包的作者们(尚)没有预料到需要涵盖这种用例。 - Martijn Pieters
1
@MartijnPieters,实际上,SyncManager继承自BaseManager,后者具有一个记录在案的register类方法。 - senderle
@senderle:很酷,那我就改口了。 - Martijn Pieters
@senderle,@MartijnPieters:我要试一试你们的想法能不能帮得上忙!!! - Jessada Thutkawkorapin
显示剩余5条评论
1个回答

2

根据 @senderle 和 @Martijn Pieters 的建议,我成功地获得了一个解决方案

from multiprocessing.managers import BaseManager
from multiprocessing.managers import BaseProxy

class DataSetClass(list):
    @property
    def n_training(self):
        return len(self) * 0.8
    @property
    def n_validation(self):
        return len(self) * 0.2

class DataSetProxy(BaseProxy):
    _exposed_ = ('append', '__len__')
    def append(self, item):
        return self._callmethod('append', item)
    def __len__(self):
        return self._callmethod('__len__')

class MyManager(BaseManager):
    pass

MyManager.register('DataSet', DatasetClass, DataSetProxy)

if __name__ == '__main__':
    manager = MyManager()
    manager.start()
    dataset = manager.DataSet()
    dataset.append('item1')
    dataset.append('item2')
    print len(dataset)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接