2013-05-07 4 views
2

Je n'arrive pas à partager un ensemble de processus à l'aide d'une instance Manager. Une version condensée de mon code:Utilisation de jeux avec le module multitraitement

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

J'ai aussi essayé register(type(Set)) et register(Set()), mais je ne suis pas trop surpris de constater que ni d'entre eux travaillaient (la première devrait évaluer la classe, je pense).

L'exception que je reçois dans tous les cas est TypeError: __name__ must be set to a string object dans la ligne 675 de managers.py.

Existe-t-il un moyen de le faire, ou ai-je besoin d'étudier des alternatives?

+1

Pourquoi utiliser 'Set' (le module) quand vous avez' set' (le type intégré)? –

+1

Et la méthode '.register()' nécessite plus d'arguments, le premier argument étant le * nom * du type. –

Répondre

3

Le premier argument de la SyncManager.register() class method doit être une chaîne , pas cass:

SyncManager.register('set', set) 

mais vous devez vous inscrire un proxy pour les jeux ainsi:

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) 
+0

Bien sûr! Merci de m'avoir signalé les choses que j'aurais vraiment dû remarquer quand je RTFM. – Hotchips

+0

@Hotchips: Je réintroduis les noms '__i * __' dans la liste 'exposed' du proxy; en lisant le code 'ListProxy', je pense avoir découvert un bug en ce sens qu'il n'expose pas correctement la méthode' list .__ iadd__'. Pas 100%, mais les énumérer dans la liste 'BaseSetProxy' ne fait pas de mal, et les omettre pourrait être un bug. –

Questions connexes