Python 3: ¿Pool mantiene el orden original de los datos pasados al mapa?

He escrito un pequeño script para distribuir la carga de trabajo entre 4 hilos y para probar si los resultados se mantienen ordenados (con respecto al orden de la entrada):

from multiprocessing import Pool
import numpy as np
import time
import random


rows = 16
columns = 1000000

vals = np.arange(rows * columns, dtype=np.int32).reshape(rows, columns)

def worker(arr):
    time.sleep(random.random())        # let the process sleep a random
    for idx in np.ndindex(arr.shape):  # amount of time to ensure that
        arr[idx] += 1                  # the processes finish at different
                                       # time steps
    return arr

# create the threadpool
with Pool(4) as p:
    # schedule one map/worker for each row in the original data
    q = p.map(worker, [row for row in vals])

for idx, row in enumerate(q):
    print("[{:0>2}]: {: >8} - {: >8}".format(idx, row[0], row[-1]))

Para mí esto siempre resulta en:

[00]:        1 -  1000000
[01]:  1000001 -  2000000
[02]:  2000001 -  3000000
[03]:  3000001 -  4000000
[04]:  4000001 -  5000000
[05]:  5000001 -  6000000
[06]:  6000001 -  7000000
[07]:  7000001 -  8000000
[08]:  8000001 -  9000000
[09]:  9000001 - 10000000
[10]: 10000001 - 11000000
[11]: 11000001 - 12000000
[12]: 12000001 - 13000000
[13]: 13000001 - 14000000
[14]: 14000001 - 15000000
[15]: 15000001 - 16000000

Pregunta: También lo hacePool Realmente mantener el orden de entrada original al almacenar los resultados de cadamap funcionar enq?

Nota al margen: Estoy preguntando esto, porque necesito una manera fácil de paralelizar el trabajo con varios trabajadores. En algunos casos, el orden es irrelevante. Sin embargo, hay algunos casos en los que los resultados (como enq) deben devolverse en el orden original, porque estoy usando una función de reducción adicional que se basa en datos ordenados.

Actuación: En mi máquina, esta operación es aproximadamente 4 veces más rápida (como se esperaba, ya que tengo 4 núcleos) que la ejecución normal en un solo proceso. Además, los 4 núcleos están al 100% de uso durante el tiempo de ejecución.

Respuestas a la pregunta(2)

Su respuesta a la pregunta