2014-01-22 7 views
7

Ich muss Zeichenfolgen lesen, die von Multiprocessing geschrieben wurden. Prozessinstanzen aus dem Hauptprozess. Ich verwende bereits Manager und Warteschlangen Argumente Prozesse zu übergeben, so dass die Manager mit scheinen offensichtlich, but Managers do not support strings:Wie teilt man eine Kette zwischen mehreren Prozessen mit Managers() in Python?

Ein Manager von Managern() zurückgegeben werden Arten Liste unterstützen, dict, Namespace, Lock, RLOCK, Semaphore, BoundedSemaphore, Bedingung, Ereignis, Warteschlange, Wert und Array.

Wie teile ich den Status, der durch eine Zeichenfolge dargestellt wird, mit Managern aus dem Multiprocessing-Modul?

Antwort

7

Manager können die Multiprocessing Values halten, die wiederum Instanzen des Typs c_char_p vom ctypes Modul halten:

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

Siehe auch: Post with the original solution, dass ich eine harte Zeit zu finden hatte.

So kann ein Manager verwendet werden, wie dies eine Zeichenfolge unter mehreren Prozessen in Python zu teilen:

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

Ich fragte mich, warum das funktioniert (teilen einen Zeiger), und aus den Quellen habe ich gelernt, dass 'managers.Value' nicht tatsächlich das' typecode' Argument überhaupt verwendet. Die Zeichenfolge wird nicht in 'c_char_p' konvertiert. 'multiprocessing.Value' funktioniert sehr unterschiedlich. –

4

einfach die Zeichenfolge setzen in einem dict:

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

als Strings selbst unveränderlich sind, eine direkt zu teilen wäre nicht so nützlich.

Verwandte Themen