Как правильно запустить многопроцессорный пул Python внутри большего цикла и закрыть его до начала следующего циклаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно запустить многопроцессорный пул Python внутри большего цикла и закрыть его до начала следующего цикла

Сообщение Anonymous »

У меня есть большой сценарий, в котором я обрабатываю терабайты данных о погоде/климате, которые поступают в формате сетки. У меня есть сценарий, который использует внешний цикл (по годам – с 1979 по 2024 год) и для каждого года циклически повторяет каждый месяц (1–12), поскольку данные за каждый месяц поступают в ежемесячные файлы, и дополнительный цикл, который циклически повторяется. каждый час или станцию, в зависимости от обстоятельств, в пределах каждого месячного цикла. Эти циклы заполняют массивы, имеющие вид [hr, stn, уровень давления] или [hr, stn], в зависимости от переменной. Эта часть работает нормально.
Как только у меня есть данные в массивах, я использую функцию multiprocessingpool.starmap для параллельного запуска вычислений пакета Metpy, которые работают только с 1D массивы. Здесь происходит что-то странное. Теперь программа, похоже, возвращается к внешнему циклу на несколько лет и снова начинает выполнять команду «# начать с обработки некоторых файлов, которые поступают в ежегодном формате».
Вот мой код, который носит обобщенный характер, поскольку у меня было много проблем при попытке воспроизвести эту ошибку на гораздо меньшем примере.

Код: Выделить всё

# loop over years
for yr in np.arange(46) + 1979:
# begin by processing some files that come in yearly format

# loop over months
for mo in range(12) + 1:
# open and put data from specific lat/lon points into arrays by variable

# loop over lat/lon locations ("stations")
for station in range(50):
for hr in range(2920):
# fill arrays

# go back to working within outer loop (years) for starting multiprocessing work on filled arrays
with Pool(processes = 16) as pool1:
tw_sfc_pooled = pool1.starmap(mpcalc.wet_bulb_temperature, tw_sfc_argument_list)
bulk_shear_1km_pooled = pool1.starmap(mpcalc.bulk_shear, bulk_shear_1km_argument_list)
many_more_pooled = poo1.starmap(mpcalc.func, many arg lists)
pool1.close()  # am I closing this wrong?
pool1.join()   # do I need this statement here?

# put pooled lists into final variable arrays for use in work
Код работает нормально, пока многопроцессорная обработка не завершится. Оттуда он возвращается во внешний цикл и начинает параллельно читать данные следующего года со многими ошибками xarray и другими (я использую xarray для чтения файлов netcdf). Итак, первый год обработки данных проходит нормально, но на второй год все терпит неудачу.
Я предполагаю, что либо многопроцессорная обработка не запускается или не корректно останавливается в моем коде, либо ему не нравится находиться внутри цикла, или, возможно, проблемы возникают из-за наличия более 20 процессов Pool.starmap. Не знаю.
Есть мысли, в чем проблема?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -shut-it-d
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»