Python (многопроцессорность/tqdm) – как отслеживать ход выполнения цикла for в многопроцессорной функции?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python (многопроцессорность/tqdm) – как отслеживать ход выполнения цикла for в многопроцессорной функции?

Сообщение Anonymous »

В настоящее время я пытаюсь отслеживать ход выполнения нескольких экземпляров функции, причем каждый экземпляр выполняет итерацию внутри самой функции. Я использую многопроцессорную обработку для запуска нескольких экземпляров указанной функции и пытаюсь использовать tqdm для отслеживания хода выполнения каждого из этих экземпляров функции.
(Примечание: я использую блокнот Jupyter для своего основного сценария и сохраняю функцию во внешнем файле "functions.py". Это необходимо для работы нескольких процессов внутри блокнота.)
Functions.py
Функция запускает внешнюю программу, которая выполняет итеративные вычисления, выдавая выходные данные после каждой итерации. Я фиксирую этот вывод в цикле for, который сам выполняет итерацию только при появлении нового вывода

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

def run_exe_instance(args):
import os
import subprocess
#do stuff
os.chdir(directory)
exe_process = subprocess.Popen(["program.exe"],shell=True,stdout=subprocess.PIPE)
os.chdir(notebookFolder) #Switches directory back to notebook folder
for i1 in range(number_of_exe_iterations): #THE LOOP TO TRACK ITERATIONS OF
if (line := exe_process.stdout.readline()) != "":
pass
print("Finished!")
Основная

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

import os
import subprocess
import multiprocessing
import Functions as f

if __name__ == "__main__":
__spec__ = None            #bugfix for iPython/Jupyter Notebook
args = [(some args,),(some more args,)]
pool = mp.Pool(len(args))
pool.starmap(f.run_exe_instance, args)
pool.close()
pool.join()
Этот код предназначен для фактического выполнения нескольких экземпляров «program.exe» и последующего перехода после их завершения. Однако я не могу понять, как реализовать несколько индикаторов выполнения для отслеживания одновременного хода процессов.
Сначала я попробовал использовать tqdm внутри функции. Однако любые выходные данные внутри функции выводятся в окно командной строки «Anaconda Prompt», которое я использовал для запуска своего блокнота Jupyter. В этом окне индикаторы выполнения не работают.

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

def run_exe_instance(args):
import os
import subprocess
#do stuff
os.chdir(directory)
exe_process = subprocess.Popen(["program.exe"],shell=True,stdout=subprocess.PIPE)
os.chdir(notebookFolder) #Switches directory back to notebook folder
for i1 in tqdm(range(number_of_exe_iterations),desc=filename,position=bar_position): #THE LOOP TO TRACK ITERATIONS OF
if (line := exe_process.stdout.readline()) != "":
pass
print("Finished!")
После этой неудачи я попытался передать индикатор выполнения tqdm в качестве аргумента в функцию, а затем обновить ее прогресс с помощью pbar.update(). Это работает для немультипроцессорных функций, но многопроцессорность выдает мне ошибку TypeError: невозможно выбрать объект '_hashlib.HMAC'.
Я также пробовал использовать p_tqdm. Однако индикаторы выполнения повторяются только каждый раз, когда функция возвращается. В случае с моей функцией она не завершится до тех пор, пока не завершится «program.exe».
Будем очень благодарны за любые идеи.

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

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

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

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

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

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

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