2016-04-21 2 views
2

Я столкнулся с этой проблемой, что в итоговом результате отсутствует какой-либо dict литерал, связанный с ipyparallel map, и становится {}.IPython-Parallel: Dict literal отсутствует на параллельной карте

Эта проблема не влияет на элементы dict, добавленные с помощью метода update и конструкторов dict.

Чтобы воспроизвести проблему, вы можете развернуть кластер с помощью direct view, называемого, скажем dview. Следующий код был протестирован в IPython с Python 3.4 (как клиент, так и движок).

dview.map(lambda x: {'label': x*2}, range(4)} 

Он вернется [{}, {}, {}, {}], когда вы ожидаете, что ключ label появится в Словаре.

Та же проблема возникает и в следующих ситуациях:

  • Нормальная функция объявления
  • Dict буквальным используется в качестве промежуточного значения (даже в качестве аргумента update)
+0

Просто поняли: Это только воспроизводимый с использованием удаленного кластера. Создайте 'ipcluster' на локальной машине, он отлично работает. Даже если я выполняю 'ipython', тогда' rc = Client() 'на самой машине, на которой размещен контроллер, приведенный выше код работает правильно. – streamliner18

ответ

0

Не уверен, если это относится к вашей проблеме python 3.4, но когда я запускаю ваш код на python 2.7.9, метод map генерирует асинхронный объект, а не словарь. Чтобы получить словарь с использованием метода map, я должен использовать понимание списка для итерации через объект async. Однако метод map_sync работает отлично.

Вот фрагмент кода, если вы хотите попробовать его на удаленный кластере (вставив соответствующий файл в формате JSON):

from IPython.parallel import Client 

c = Client() 
dview = c[:] 

smap = dview.map_sync(lambda x: {'label': x*2}, range(4)) 
print(smap) #gives dict 

amap = dview.map(lambda x: {'label': x*2}, range(4)) 
print(amap) #produces async obj 

amap_dict = [r for i,r in enumerate(amap)] 
print(amap_dict) #gives dict 

Более подробная информация о асинхронных объектах здесь: https://ipython.org/ipython-doc/2/parallel/asyncresult.html#map-results-are-iterable