Карта многопроцессорной обработки ведет себя по-другому, потому что она не грамотно переписывается по истребимому объекту карты, как это делает встроенная карта, и сразу же разбивает каждую итерацию на отдельный процесс и объединяет результаты.
Если вы не знакомы с параллельными принципами, я попытаюсь кратко объяснить это немного лучше.
В вашем первом примере, используя встроенную карту, код создаст итерируемый объект, который позволит вам выполнить worker
по одному, последовательно. Тот факт, что он выполняет один за раз и последовательно, означает, что ваша функция, которая печатает worker call x=
, всегда будет печататься первой, прежде чем выполнение продолжится во внутренней части вашего цикла, которая будет печатать только значение x
. Это также означает, что когда ваша петля достигает 2, вы можете выйти из цикла без каких-либо дополнительных вызовов на карту или на тело цикла. Это синхронная операция, все вежливо и ждет своей очереди.
В вашем втором примере использование кода мультипроцессорной карты все равно создаст итерируемый объект, который обрабатывает worker(x)
. На этот раз, однако, вы не выполняете каждый звонок до worker(x)
по одному (синхронно). Многопроцессорный вызов карты немедленно отправит все вызовы карты отдельным процессам для выполнения сначала, а затем объедините результаты. Затем ваш цикл выполняет комбинированные результаты и снова останавливается на 2, как вы его инструктировали. К сожалению, все записи в карте уже выполнялись в отдельных процессах, так что тело цикла выполнялось минимальное количество раз, а карта не была.
Надеюсь, это поможет вам понять, почему немного лучше.