Найти тему
NTA

Распределение вычислительной мощности между несколькими ПК

Автор: Кочергин Николай, г. Ростов-на-Дону
Автор: Кочергин Николай, г. Ростов-на-Дону

#python #параллельные вычисления #анализ данных

В ходе работы возникла задач обработки огромного объема (~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 дней.

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

Читайте также: