2015-05-20 5 views
0

Я пытаюсь распараллелить функцию в Python 2.7 с помощью модуля многопроцессорности. К сожалению, в моей функции пула я, кажется, получаю ошибку при передаче нескольких аргументов. Я попытался упаковать их в виде списка кортежей, как класс, и как список списков, и все, кажется, дает мне следующую ошибку:Ошибка имени пула с несколькими аргументами

File "plot_gfs.py", line 132, in plot_data 
results = pool.map(plot_var,args) 
File "/opt/Python2.7/lib/python2.7/multiprocessing/pool.py", line 251, in map 
return self.map_async(func, iterable, chunksize).get() 
File "/opt/Python2.7/lib/python2.7/multiprocessing/pool.py", line 558, in get 
raise self._value 
AttributeError: 'str' object has no attribute 'name' 

Это мой параллельный код функции:

def plot_data(lats, lons, bounds): 

    lons2, lats2 = np.meshgrid(lons, lats) 

    x, y = basem(lons2, lats2) 

    pool = mp.Pool(4) 
    args = [('prmslmsl', 0, 'jet', 950, 1050, i, x, y, bounds) 
      for i in range(80)] 
    results = pool.map(plot_var, args) 
    pool.close() 
    pool.join() 

как примечание: функция plot_var тег:

def plot_var(var_in): 

ответ

1

Попробуйте передавая аргументы в виде кортежа:

results = pool.map(plot_var, (args)) 

или, в зависимости от вашего использования:

results = [pool.map(plot_var, a) for a in agrs] 
+0

Passing аргументы в виде кортежа производит ту же ошибку. Я работаю над тем, чтобы ваше второе решение работало, но оно, по-видимому, передает каждое значение моего кортежа индивидуально (поэтому он передает элемент 1 кортежа 1, элемент 2 кортежа 1 и т. Д.) – Laxsnor

+0

Я понял, почему ваш второе решение не работает - оно не соответствует моему использованию. У меня есть список кортежей, и я пытаюсь сопоставить plot_var с каждым кортежем. – Laxsnor

+0

args - список кортежей, правильно? Если это так, вы должны иметь возможность перебирать его для получения кортежей, например. args = [(1,2,3), (4,5,6)], >>> [a для a in args] Выход [4]: ​​[(1, 2, 3), (4, 5, 6)] – Alexander

Смежные вопросы