¿Cómo compartir una cadena entre varios procesos usando Managers () en Python?

Necesito leer cadenas escritas por multiprocesamiento. Procesos de proceso del proceso principal. Ya utilizo Administradores y colas para pasar argumentos a los procesos, por lo que el uso de Administradores parece obvio, pero los Administradores no admiten cadenas :

Un administrador devuelto por Manager () admitirá la lista de tipos, dict, espacio de nombres, locking, locking de locking, semáforo, semáforo de Bounded, condición, evento, cola, valor y matriz.

¿Cómo comparto el estado representado por una cadena utilizando Administradores del módulo de multiprocesamiento?

Los gestores de multiprocesamiento pueden mantener valores que a su vez pueden contener instancias del tipo c_char_p desde el módulo ctypes:

>>> import multiprocessing >>> import ctypes >>> v = multiprocessing.Value('c', "Hello, World!") Traceback (most recent call last): File "", line 1, in  File "/usr/lib/python2.7/multiprocessing/__init__.py", line 253, in Value return Value(typecode_or_type, *args, **kwds) File "/usr/lib/python2.7/multiprocessing/sharedctypes.py", line 99, in Value obj = RawValue(typecode_or_type, *args) File "/usr/lib/python2.7/multiprocessing/sharedctypes.py", line 73, in RawValue obj.__init__(*args) TypeError: one character string expected >>> cstring = multiprocessing.Value(ctypes.c_char_p, "Hello, World!") >>> cstring  >>> cstring.value 'Hello, World!' 

Ver también: Publicar con la solución original que me costó encontrar.

Por lo tanto, se puede usar un Administrador para compartir una cadena debajo de múltiples procesos en Python, como este:

 >>> from multiprocessing import Process, Manager, Value >>> from ctypes import c_char_p >>> >>> def greet(string): >>> string.value = string.value + ", World!" >>> >>> if __name__ == '__main__': >>> manager = Manager() >>> string = manager.Value(c_char_p, "Hello") >>> process = Process(target=greet, args=(string,)) >>> process.start() >>> process.join() >>> print string.value 'Hello, World!' 

Simplemente ponga la cadena en un dict :

 d = manager.dict() d['state'] = 'xyz' 

Como las cuerdas son inmutables, compartir una directamente no sería tan útil.