Зачем нужен pickle для многопроцессорного модуля в python? - PullRequest
0 голосов
/ 02 октября 2018

Я делал многопроцессорную обработку в python и обнаружил ошибку травления.Что заставляет меня задуматься, почему мы должны выбирать объект для многопроцессорной обработки?разве fork () недостаточно?

Редактировать: Я понимаю, почему нам нужен рассол для межпроцессного взаимодействия, но это только для данных, которые вы хотите передать правильно?почему многопроцессорный модуль также пытается выбирать такие вещи, как функции и т. д.

1 Ответ

0 голосов
/ 02 октября 2018

Что заставляет меня задуматься, зачем нам нужно мариновать объект для многопроцессорной обработки?

Нам не нужно pickle, но нам нужно обмениваться данными между процессами, и pickle оказывается очень удобным, быстрым и общим методом сериализации для Python. Сериализация - это один из способов взаимодействия между процессами.Совместное использование памяти является другим.В отличие от совместного использования памяти, процессы даже не должны находиться на одной машине для связи.Например, PySpark очень интенсивно использует сериализацию для связи между исполнителями (которые обычно являются разными машинами).

Приложение: Есть также проблемы с GIL (Global Interpreter Lock) при совместном использовании памяти вPython (подробности см. В комментариях ниже).

не достаточно fork ()?

Нет, если вы хотите, чтобы ваши процессы взаимодействовали и обменивались данными после они разветвлены. fork() клонирует текущее пространство памяти, но изменения в одном процессе не будут отражены в другом после разветвления (если, конечно, мы не будем явно обмениваться данными).

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

  1. Иногда сложные объекты (то есть «другие вещи»? не совсем понятно, что вы здесь имели в виду) содержатданными, которыми вы хотите манипулировать, поэтому мы определенно хотим иметь возможность отправлять эти «другие вещи».

  2. Возможность отправить функцию другому процессу - это невероятно полезно. Вы можете создать группу дочерних процессов и затем отправить им все функции для одновременного выполнения, которые вы определили позже в своей программе.Это, по сути, суть PySpark (опять-таки немного не по теме, поскольку PySpark не multiprocessing, но он кажется странно актуальным).

  3. Есть некоторые функциональные пуристы (в основномЛюди LISP), которые приводят аргументы в пользу того, что код и данные - это одно и то же.Так что для некоторых это не так уж и сложно.

...