2014-01-22 3 views
7

Мне нужно прочитать строки, написанные многопроцессорными экземплярами. Процессы из основного процесса. Я уже использую менеджер и очереди передать аргументы процессам, поэтому использование Менеджеры кажется очевидными, but Managers do not support strings:Как передать строку из нескольких процессов с помощью Managers() в Python?

Менеджер вернулся Менеджером() будет поддерживать список типов, Dict, пространства имен, Lock, RLOCK, семафор, BoundedSemaphore, Условие, Событие, Очередь, значение и массив.

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

ответ

7

MultiProcessing может держать Values в свою очередь, может содержать экземпляры типа 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!' 

Смотрите также: Post with the original solution, что у меня было трудно найти.

Так менеджер может быть использован, чтобы разделить строку под несколькими процессами в 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!' 
+0

Мне было интересно, почему это работает (разделяя указатель), и из источников я узнал, что 'manager.Value' фактически не использует аргумент' typecode' вообще. Строка не преобразуется в 'c_char_p'. 'multiprocessing.Value' работает совсем по-другому. –

4

Просто добавьте строку в dict:

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

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