Распараллеливание без рассола

1

Алекс Гейнор объясняет некоторые проблемы с рассолом в своем выступлении "Соленья для delis, а не для программного обеспечения", в том числе безопасность, надежность, удобочитаемость. Я обычно опасаюсь использовать pickle для данных в моих программах на python. Как правило, я предпочитаю передавать свои данные с помощью json или других форматов сериализации, определенных мной, вручную.

Ситуация, которая меня интересует, такова: я собрал некоторые данные в своей программе на Python и хочу выполнить смущающе параллельное задание несколько раз параллельно.

Насколько я знаю, самая лучшая библиотека распараллеливания для выполнения этого в python сейчас распределена по dask, за которой следуют joblib -rallel, concurrent.futures и многопроцессорность.

Тем не менее, все эти решения используют pickle для сериализации. Учитывая различные проблемы с pickle, я склонен просто отправлять массив json в подпроцесс GNU parallel. Но, конечно, это похоже на взлом, и теряет всю причудливую доброту Даск.

Можно ли указать другой формат сериализации по умолчанию для моих данных, но продолжать параллелизацию в python, предпочтительно в dask, не прибегая к маринованию или gnu-параллели?

Теги:
dask
parallel-processing
dask-distributed

2 ответа

2

На странице http://distributed.dask.org/en/latest/protocol.html стоит прочитать о том, как Dask передает информацию распределенным работникам и планировщику. Как видно, (облачный) pickle входит в картину для таких вещей, как функции, которые мы хотим передать работникам, чтобы они могли их выполнять, но данные, как правило, отправляются посредством довольно эффективной сериализации msgpack. Не было бы возможности сериализовать функции с JSON. На самом деле, существует довольно гибкий механизм внутренней диспетчеризации, позволяющий решить, что и с каким механизмом сериализовать, но здесь нет необходимости разбираться с этим.

Я бы также утверждал, что pickle - это прекрасный способ сериализации некоторых вещей при передаче между процессами, если у вас возникли проблемы с обеспечением согласованной среды между ними, что является предположением, которое делает Dask.

-редактировать-

Конечно, вы могли бы включить имена функций или экранирование в JSON, но я бы сказал, что это так же хрупко, как и мариновать.

0

Pickles плохо подходят для длительного хранения ("что если мое определение класса изменится после того, как я что-то сохранил в базе данных?") И ужасно для принятия в качестве пользовательского ввода:

def foo():
    os.system('rm -rf /')

return {'lol': foo}

Но я не думаю, что есть какие-либо проблемы с их использованием в данном конкретном случае. Предположим, вы передаете объекты datetime. Вы действительно хотите написать свой специальный адаптер JSON для их сериализации и десериализации? Я имею в виду, вы можете, но вы хотите? Соленья хорошо указаны, и процесс идет быстро. Это именно то, что вам нужно здесь, когда вы не сохраняете промежуточный сериализованный объект и не принимаете объекты от третьих лиц. Вы буквально передаете их от себя себе.

Я очень рекомендую выбрать библиотеку, которую вы хотите использовать - вам нравится Dask? Действуй! - и не беспокоиться о его внутренностях до тех пор, пока вам не придётся позаботиться. А пока сконцентрируйтесь на тех частях вашей программы, которые уникальны для вашей проблемы. Хорошие шансы, что основной формат сериализации не будет одним из них.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню