2

我似乎无法使用 Manager 实例跨进程共享一组。我的代码的精简版:

from multiprocessing.managers import SyncManager
manager = SyncManager()
manager.start()
manager.register(Set)

我也尝试过register(type(Set))and register(Set()),但我对它们都不起作用(我认为第一个应该评估为 Class)并不过分惊讶。

我在所有情况下都得到的例外是TypeError: __name__ must be set to a string objectmanagers.py 的第675 行。

有没有办法做到这一点,还是我需要调查替代方案?

4

1 回答 1

5

SyncManager.register()类方法的第一个参数必须是字符串,而不是 cass:

SyncManager.register('set', set)

但您还需要为集合注册代理:

from multiprocessing.managers import MakeProxyType

BaseSetProxy = MakeProxyType('BaseSetProxy', (
    '__and__', '__contains__', '__iand__', '__ior__', 
    '__isub__', '__ixor__', '__len__', '__or__', '__rand__', '__ror__', '__rsub__',
    '__rxor__', '__sub__', '__xor__', 'add', 'clear', 'copy', 'difference',
    'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint',
    'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 
    'symmetric_difference_update', 'union', 'update']
    ))
class SetProxy(BaseSetProxy):
    # in-place hooks need to return `self`, specify these manually
    def __iand__(self, value):
        self._callmethod('__iand__', (value,))
        return self
    def __ior__(self, value):
        self._callmethod('__ior__', (value,))
        return self
    def __isub__(self, value):
        self._callmethod('__isub__', (value,))
        return self
    def __ixor__(self, value):
        self._callmethod('__ixor__', (value,))
        return self

SyncManager.register('set', set, SetProxy)
于 2013-05-07T09:13:01.790 回答