В ходе работы возникла задача обработки огромного объема (~500 Гб) аудиозаписей в условиях ограниченного времени. На одном ПК обработка заняла бы не менее месяца, что не вписывалось в установленные заказчиком сроки. Возникла идея подключения компьютеров коллег, у которых ночью ПК «отдыхают».
Весь процесс можно разбить на несколько шагов:
Установка Python на рабочий компьютер.
Скачивание на компьютер архива, состоящего из 2-х bat-файлов (один – для настройки окружения, второй – для запуска скрипта), списка необходимых библиотек, скрипта для обработки аудиозаписей.
Настройка виртуального окружения и запуск скрипта.
Разберем код для настройки.
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)
spacediver
26.05.2022 14:35+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)
Может данный скрипт и закрывает ваши личные потребности, но это всё довольно легко ищется в поиске.
nukler
27.05.2022 14:13>>Судя по коду, к получению файлов вы никогда не перейдёте.
Ага, а после "files = os.listdir(directory)" обнаружится стотыщьмильенов файлов, операционка выдохнет и пойдет смотреть сколько у неё есть места для свопа. А дальше больше "for file in files:" будет медленно и уныло перебирать каждый файл загружая на 100% одно ядро 12 ядерного Intel Core i7 - 12700.
АСТАНАВИТЕСЬ!
OptimumOption
27.05.2022 11:40Я уже приготовился записывать простой рецепт универсального распараллеливания задачи и консолидации географически распределенных процессорных мощностей, но меня ждал облом... Статья ни о чем... Причем еще и заголовок не соответствует содержимому...
stalinets
29.05.2022 02:18А можно было пойти другим путём? Найти в продаже у перекупов или сборщиков китайскую двухпроцессорную материнку на сокеты 2011v3 и пару процессоров Haswell на много-много ядер и потоков, например, 2*(18c36t), и запустить обработку на этом монстре во все 72 потока. Такие компы очень любят видеомонтажёры, чтобы быстро рендерить 4k и 8k видео.
Jury_78
Это не похоже на python
к тому же цикл бесконечный...