В ходе работы возникла задача обработки огромного объема (~500 Гб) аудиозаписей в условиях ограниченного времени. На одном ПК обработка заняла бы не менее месяца, что не вписывалось в установленные заказчиком сроки. Возникла идея подключения компьютеров коллег, у которых ночью ПК «отдыхают».

Весь процесс можно разбить на несколько шагов:

  1. Установка Python на рабочий компьютер.

  2. Скачивание на компьютер архива, состоящего из 2-х bat-файлов (один – для настройки окружения, второй – для запуска скрипта), списка необходимых библиотек, скрипта для обработки аудиозаписей.

  3. Настройка виртуального окружения и запуск скрипта.

Разберем код для настройки.

Bat-файл настройки окружения, запускающийся в папке для скрипта:

Python –m venv work_env
Work_env\Scripts\pip.exe install -r requirements.txt

Этим действием мы настроили окружение для запуска второго bat-файла с кодом, который запускает сам скрипт.

Код 2-го bat-файла.

Work_env\Scripts\python.exe script_name.py

Важно указать полный путь из виртуального окружения для pip и python для их корректного запуска.

Таким образом возможно подключить к обработке компьютеры коллег, даже не знакомых с программированием и находящихся в разных часовых поясах, написав им небольшую инструкцию.

Усложним задачу. Представим, что обработка у нас в несколько этапов. Первый этап мы проводим у себя на ПК, отправляем результат на сетевую папку, откуда ночью второй ПК должен взять его в обработку. При переносе файлов, сделаем оповещение на почту себе в Outlook, чтобы можно было отслеживать прогресс работы. Как один из вариантов – это записывать файлы в тестовый документ, но это не удобно для просмотра, а в Outlook можно поставить в копию заинтересованных лиц, чтобы они тоже были уведомлены об этапах обработки. Для удобства просмотра сообщений возможно создать правило для перемещения сгенерированных сообщений в отдельную папку по теме сообщения.

Код для решения такой задачи на ПК коллеги может выглядеть следующим образом:

#Импорт библиотек
import os 
import time
import shutil
import win32com.client as win32
#Прописываем путь до сетевой папки и папки, в которую необходимо сбрасывать результаты. 
directory = r’Folder_path’ 
destination_path= r’Destination_folder_path’
#Запускаем проверку на наличие файлов каждую минуту
While True: 
 	Time.sleep(60)
#Получаем список файлов
files = os.listdir(directory)
#Проверяем, появились ли файлы для обработки.
if  len(files)>0:
	#При наличии файлов запускаем их в обработку.
		for file in files:
			#Для примера они просто переносятся в другую папку.
			shutil.move(file, file_destination)
outlook=win32.Dispatch('outlook.application')
mail=outlook.CreateItem(0)
mail.To=’my_mail@mail.ru'  #e-mail
mail.Subject='Topic'            #Тема
mail.Body=’Перенесено '+ str(len(files)) + ‘ в папку ’ + destination_path         #Пишет сколько файлов перенесено и в какую папку
mail.Send()                          #Отправка
	#Если файлов нет, возвращаемся в начало цикла.
elif len(files)==0:
		continue

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

Кстати, в моем случае, задействовав 5 компьютеров, поставленную задачу по обработке аудиозаписей удалось решить за 6 дней.

Спасибо за внимание!

Комментарии (6)


  1. Jury_78
    26.05.2022 14:24
    +1

    Это не похоже на python

    #Запускаем проверку на наличие файлов каждую минуту
    While True: 
     	Time.sleep(60)
    #Получаем список файлов
    files = os.listdir(directory)

    к тому же цикл бесконечный...


  1. spacediver
    26.05.2022 14:35
    +1

    Спасибо, хороший пример бытового программирования на питоне! Этим он и хорош)

    Отдельный интерес: а в чём примерно заключалась обработка и как вам удалось её автоматизировать?


  1. thedrnic
    26.05.2022 14:43
    +1

    Никак не показано кто и как будет будет заполнять папку с файлами для обработки, а между прочим логика скрипта-менеджера, который бы распределял нагрузку на доступные машины, была бы куда интереснее.


    Судя по коду, к получению файлов вы никогда не перейдёте.

    While True: 
     	Time.sleep(60)
    #Получаем список файлов
    files = os.listdir(directory)

    если это псевдо-код, то он несёт краёне малое количество полезной нагрузки.

    А если линукс, то как быть или в системе может не быть мейлера, тогда как?

    outlook=win32.Dispatch('outlook.application')
    mail=outlook.CreateItem(0)

    Может данный скрипт и закрывает ваши личные потребности, но это всё довольно легко ищется в поиске.


    1. nukler
      27.05.2022 14:13

      >>Судя по коду, к получению файлов вы никогда не перейдёте.

      Ага, а после "files = os.listdir(directory)" обнаружится стотыщьмильенов файлов, операционка выдохнет и пойдет смотреть сколько у неё есть места для свопа. А дальше больше "for file in files:" будет медленно и уныло перебирать каждый файл загружая на 100% одно ядро 12 ядерного Intel Core i7 - 12700.
      АСТАНАВИТЕСЬ!


  1. OptimumOption
    27.05.2022 11:40

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


  1. stalinets
    29.05.2022 02:18

    А можно было пойти другим путём? Найти в продаже у перекупов или сборщиков китайскую двухпроцессорную материнку на сокеты 2011v3 и пару процессоров Haswell на много-много ядер и потоков, например, 2*(18c36t), и запустить обработку на этом монстре во все 72 потока. Такие компы очень любят видеомонтажёры, чтобы быстро рендерить 4k и 8k видео.