2014-12-18 1 views
0

Я пытаюсь использовать Process Массивы для того, чтобы использовать структуру массива между несколькими процессами, но не могу показаться, чтобы инициализировать the example:Python многопроцессорной Инициализация массива

from multiprocessing import Process, Lock 
from multiprocessing.sharedctypes import Value, Array 
from ctypes import Structure, c_double,c_char_p 

class Point(Structure): 
    _fields_ = [('x', c_double), ('y', c_double)] 

class Call(Structure): 
    _fields_ = [('participantId',c_char_p)] 

def modify(n,s): 
    n.value **= 2 
    #x.value **= 2 
    s.value = s.value.upper() 
    #for a in A: 
    # a.x **= 2 
    # a.y **= 2 

if __name__ == '__main__': 
    lock = Lock() 

    n = Value('i', 7) 
    #x = Value(c_double, 1.0/3.0, lock=False) 
    s = Array('c', 'hello world', lock=lock) 
    A = Array(Call,['ebtirgnm-sqr7-h2fd-wa80-baoctu684qma'], lock=lock) 
    #A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock) 

    p = Process(target=modify, args=(n,s)) 
    p.start() 
    p.join() 

    print n.value 
    # print x.value 
    print s.value 

я получаю ошибку при инициализации моего массива с вызова Объект в этой строке:

A = Array(Call,['ebtirgnm-sqr7-h2fd-wa80-baoctu684qma',], lock=lock) 


/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python /Users/gogasca/Documents/OpenSource/Development/Python/tpsEmulator/tpsEmulator/tools/Array.py 
Traceback (most recent call last): 
    File "/Users/gogasca/Documents/OpenSource/Development/Python/tpsEmulator/tpsEmulator/tools/Array.py", line 25, in <module> 
    A = Array(Call,['1'], lock=lock) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/sharedctypes.py", line 115, in Array 
    obj = RawArray(typecode_or_type, size_or_initializer) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/sharedctypes.py", line 89, in RawArray 
    result.__init__(*size_or_initializer) 
TypeError: expected Call instance, got str 

Я попытался:

call1 = Call(["1"]) 
    ['1',] 
    [('1')] 
    [0] 

Не повезло

ответ

2

Существует ошибка здесь:

A = Array(Call,['ebtirgnm-sqr7-h2fd-wa80-baoctu684qma'], lock=lock) 

Python интерпретирует строку как объект, а не аргументы. Оно должно быть:

A = Array(Call,[('ebtirgnm-sqr7-h2fd-wa80-baoctu684qma',)], lock=lock) 

Тогда питон будет интерпретировать это как аргументы. же ошибка в примерах:

call1 = Call(["1"]) 
['1',] 
[('1')] 
[0] 

Давайте пытаться увидеть, что питон думает о последней запятой:

>>> print [('1')] 
['1'] 
>>> print [('1',)] 
[('1',)]