Как разделить строку между несколькими процессами, используя Managers() в Python?

Мне нужно прочитать строки, написанные multiprocessing.Process экземпляры из основного процесса. Я уже использую менеджеры и очереди для передачи аргументов процессам, поэтому использование менеджеров кажется очевидным, но менеджеры не поддерживают строки:

Менеджер, возвращаемый Manager(), будет поддерживать список типов, dict, пространство имен, блокировку, RLock, семафор, BoundedSemaphore, условие, событие, очередь, значение и массив.

Как поделиться состоянием, представленным строкой, используя Менеджеры из многопроцессорного модуля?

2 ответа

Менеджеры мультипроцессинга могут содержать значения, которые в свою очередь могут содержать экземпляры типа c_char_p из модуля ctypes:

>>> import multiprocessing
>>> import ctypes
>>> v = multiprocessing.Value('c', "Hello, World!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  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
<Synchronized wrapper for c_char_p(166841564)>
>>> cstring.value
'Hello, World!'

Смотрите также: Пост с оригинальным решением, которое мне было трудно найти.

Таким образом, менеджер может использоваться для совместного использования строки под несколькими процессами в Python, например:

>>> 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!'

Просто поместите строку в dict:

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

Поскольку сами строки являются неизменяемыми, разделение одной строки не будет столь полезным.

Другие вопросы по тегам