управление последовательностью вывода на печать после многопроцессорной обработки - PullRequest
0 голосов
/ 05 августа 2020

У меня есть следующий раздел кода, который использует многопроцессорность для запуска def chi2 (i), а затем распечатывает полный вывод:

import cmath, csv, sys, math, re
import numpy as np
import multiprocessing as mp


x1 = np.zeros(npt ,dtype=float)
x2 = np.zeros(npt ,dtype=float)

def chi2(i):
    print("wavelength", i+1," of ", npt)
    some calculations that generate x1[(i)], x2[(i)] and x[(1,i)]

    print("\t", i+1,"x1:",x1[(i)])
    print("\t", i+1,"x2:",x2[(i)])
    x[(1,i)] = x1[(i)] * x2[(i)]
    print("\t", i+1,"x:",x[(1,i)])

    return x[(1,i)]

#-----------single process--------------
#for i in range (npt):
#   chi2(i)

#------------parallel processes-------------
pool = mp.Pool(cpu)
x[1] = pool.map(chi2,[i for i in range (npt)])
pool.close() 

#general output
print("x: \n",x.T)

Если я запускаю сценарий, используя один процесс (раздел с комментариями в script) вывод будет в желаемой форме:

wavelength 1  of  221
         1 x1: -0.3253846181978943
         1 x2: -0.012596285460978723
         1 x: 0.004098637535432249
wavelength 2  of  221
         2 x1: -0.35587046869939154
         2 x2: -0.014209153301058522
         2 x: 0.005056618045069202
...
x:
 [[3.30000000e+02 4.09863754e-03]
 [3.40000000e+02 5.05661805e-03]
 [3.50000000e+02 6.20083938e-03]
...

Однако, если я запускаю сценарий с параллельными процессами, вывод wavelength i of npt печатается после вывода print("x: \n",x.T), даже если он появляется сначала в скрипте:

x:
 [[3.30000000e+02 4.09863754e-03]
 [3.40000000e+02 5.05661805e-03]
 [3.50000000e+02 6.20083938e-03]
...
wavelength 1  of  221
         1 x1: -0.3253846181978943
         1 x2: -0.012596285460978723
         1 x: 0.004098637535432249
wavelength 2  of  221
         2 x1: -0.35587046869939154
         2 x2: -0.014209153301058522
         2 x: 0.005056618045069202
...

Я подозреваю, что это как-то связано со временем обработки mp.pool, который требует больше времени для генерации вывода после pool.close(), чем более простой print("x: \n",x.T). Могу ли я узнать, как исправить последовательность вывода, чтобы запуск сценария с параллельными процессами давал ту же последовательность вывода, что и при запуске сценария с одним процессом?

1 Ответ

1 голос
/ 05 августа 2020

Смысл многопроцессорности в том, чтобы запускать два процесса одновременно, а не последовательно. Поскольку процессы независимы друг от друга, они выводят на консоль независимо друг от друга, поэтому порядок печати может меняться от выполнения к выполнению.

Когда вы выполняете pool.close (), пул закрывается, но его процессы продолжают запустить. С другой стороны, основной процесс продолжается и выводится на консоль.

Если вы хотите печатать только после того, как процессы пула будут выполнены, добавьте pool.join () после pool.close (), который будет дождитесь, пока пул завершит sh процесс, прежде чем продолжить основной процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...