Я запускаю выполнение функции
optimize
в 5 процессах, и вывожу прогресс на экран. После того, как работа функции завершилась (определяю по выводимому прогрессу) дочерние процессы не завершаются, и основной процесс не выходит из менеджера контекста
with Pool(n_jobs) as pool
, процессы также видны в диспетчере задач, но ресурсов не потребляют. Время выполнение функции в отдельном процессе примерно 5 - 10 часов. Т.е. 5 - 10 часов функции выполняют "полезную работу" после чего, процессы "зависают". С чем это может быть связано? Это может быть связано с тем, что я в основном процессе создаю экземпляр класса Verbose, передаю его в функцию, которая выполняется в отдельном процессе и которая изменяет этот класс внутри отдельного процесса?
Дополню. Если функция
optimize
выполняется не так долго (примерно 1 час - я просто уменьшаю объем необходимой работы), то все работает корректно, основной процесс выходит из менеджера контекста
with Pool(n_jobs) as pool
и код выполняется дальше. Т.е. если функция "слишком долго" выполняется в дочернем процессе, то дочерний процесс не завершается.
Также я заметил, что вместо 6 процессов (1 главный и 5 дочерних) создаются 8 процессов. Может ли это быть причиной ошибки?
Главный файл:
if __name__ == "__main__":
training(5)
Файл с функцией training:
def optimize(n_trials, model, verbose, seed):
study = optuna.create_study(
direction='maximize',
sampler=TPESampler(seed=seed)
)
study.optimize(
model,
n_trials=n_trials,
callbacks=[verbose]
)
return study
def training(n_jobs):
args = []
for i in range(n_jobs):
verbose = Verbose(n_trials, model.name, i + 1)
seed = random.randint(1, 10_000)
args += [[n_trials, model, verbose, seed]]
with Pool(n_jobs) as pool:
studies = pool.starmap(optimize, args)