
Запуск нескольких Python скриптов одновременно позволяет ускорить обработку данных и распределить нагрузку между процессами. Наиболее простой способ – использование модуля subprocess, который позволяет запускать новые процессы прямо из Python. Например, subprocess.Popen([‘python’, ‘script1.py’]) создаёт отдельный процесс для каждого скрипта без ожидания завершения предыдущего.
Для параллельного выполнения внутри одного скрипта часто применяют модуль multiprocessing. Он создаёт отдельные процессы с собственными адресами памяти, что исключает блокировку потоков при работе с вычислительно тяжёлыми задачами. Рекомендуется ограничивать количество процессов числом доступных ядер CPU, чтобы избежать чрезмерного переключения контекста.
На уровне операционной системы можно использовать одновременный запуск через командную строку. В Linux и macOS применяется символ & для фонового выполнения: python script1.py & python script2.py &. В Windows подходят команды start или PowerShell Start-Process. Такой подход эффективен для простого распределения нескольких независимых задач.
Для мониторинга и управления множественными скриптами полезно применять инструменты tmux или screen. Они позволяют отслеживать состояние процессов, перезапускать сбойные и вести логирование без необходимости интеграции с кодом. Это особенно актуально при запуске длительных вычислений или автоматизированных сценариев.
Запуск нескольких скриптов через терминал с использованием символа &
В Linux и macOS можно одновременно запускать несколько Python скриптов, добавляя символ & в конце команды. Этот символ переводит процесс в фоновый режим, позволяя терминалу сразу принимать новые команды. Например, для запуска скриптов script1.py и script2.py достаточно выполнить:
python3 script1.py & python3 script2.py &
Каждый процесс будет работать независимо, а терминал не будет блокироваться. Чтобы проверить статус запущенных скриптов, используйте команду jobs, а для завершения процесса – kill %номер_задачи.
python3 script1.py > output1.log 2>&1 & python3 script2.py > output2.log 2>&1 &
Символ & особенно удобен для тестирования множества скриптов без открытия нескольких терминалов. Важно помнить, что процессы остаются активными после закрытия терминала, если не использовать команду nohup.
Применение модуля subprocess для параллельного запуска

Модуль subprocess позволяет запускать несколько Python-скриптов одновременно без блокировки основного процесса. Для параллельного выполнения используют класс Popen, который сразу возвращает управление и продолжает выполнение программы.
Пример параллельного запуска нескольких скриптов:
import subprocess
scripts = ["script1.py", "script2.py", "script3.py"]
processes = []
for script in scripts:
proc = subprocess.Popen(["python", script])
processes.append(proc)
for proc in processes:
proc.wait()
Рекомендации по использованию:
- Использовать полный путь к интерпретатору Python для надежности на разных системах.
- Передавать аргументы скриптам через список:
["python", "script.py", "arg1", "arg2"]. - Избегать блокирующих операций в основном потоке, чтобы запуск новых процессов оставался быстрым.
- Для контроля большого числа процессов применять циклы с проверкой
proc.poll(), чтобы завершать или перезапускать зависшие задачи.
Дополнительно, можно запускать процессы с ограничением ресурсов с помощью subprocess.Popen и параметров окружения, например:
proc = subprocess.Popen(
["python", "script.py"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env={"PYTHONUNBUFFERED": "1"}
)
Использование threading для запуска функций в отдельных потоках
Создание потока выполняется через класс Thread. Конструктор принимает параметр target, указывающий функцию, и args – кортеж аргументов для этой функции.
Пример запуска двух функций одновременно:
import threading
def task1():
print("Выполняется задача 1")
def task2():
print("Выполняется задача 2")
t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)
t1.start()
t2.start()
t1.join()
t2.join()
Метод start() инициирует поток, а join() блокирует основной поток до завершения дочернего. Это гарантирует, что основной скрипт дождется выполнения всех потоков.
Для передачи аргументов в поток используется параметр args:
t = threading.Thread(target=task, args=(arg1, arg2))
Если требуется отслеживать состояние потоков, удобно хранить их в списке и последовательно вызывать join():
threads = []
for i in range(5):
t = threading.Thread(target=task, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
Ниже приведена таблица, показывающая ключевые методы класса Thread:
| Метод | Назначение |
|---|---|
| start() | Запуск потока |
| join(timeout=None) | Ожидание завершения потока, необязательный таймаут |
| is_alive() | Проверка, работает ли поток |
| setDaemon(True/False) | Установка демона для потока (поток завершится вместе с основным) |
Важно помнить, что threading не ускоряет вычисления CPU-задач из-за GIL, но идеально подходит для многопоточной работы с сетью, файлами и ожиданием событий.
Организация параллельной работы с помощью multiprocessing
Модуль multiprocessing позволяет запускать несколько процессов Python одновременно, используя все ядра процессора. Для создания процесса используется класс Process, которому передается функция и аргументы: p = Process(target=func, args=(arg1, arg2)). Запуск происходит через p.start(), а ожидание завершения – через p.join().
Для параллельного выполнения нескольких задач удобно использовать Pool. Пример: with Pool(processes=4) as pool: results = pool.map(func, iterable). Здесь processes задает количество процессов, а map автоматически распределяет задачи между ними и собирает результаты.
При обмене данными между процессами применяются очереди и пайпы: Queue обеспечивает потокобезопасное хранение объектов, Pipe создает соединение для двусторонней передачи данных. Это критично для синхронизации и предотвращения состояния гонки.
Важно помнить, что глобальные переменные не разделяются между процессами. Для общего состояния применяются Manager и разделяемые объекты типа Value и Array. Например, counter = Value('i', 0) позволяет безопасно инкрементировать счетчик из нескольких процессов.
При работе с multiprocessing необходимо защищать точку входа скрипта с помощью if __name__ == "__main__":, иначе процессы будут рекурсивно создавать новые экземпляры на Windows.
Практика показывает, что комбинирование Pool для массовых задач и Process для уникальных процессов повышает эффективность и управляемость параллельной работы в Python.
Запуск скриптов в фоне с помощью nohup и screen

Для управления несколькими фоновыми процессами удобно использовать screen. Создание новой сессии осуществляется командой screen -S mysession. Внутри сессии скрипт запускается стандартно: python3 script.py. Выход из сессии без остановки процесса выполняется комбинацией Ctrl+A, D. Список активных сессий доступен через screen -ls, возврат в сессию – screen -r mysession. Завершение сессии автоматически останавливает все процессы внутри.
Для одновременного запуска нескольких скриптов через nohup используют отдельные команды с разными файлами логов, например: nohup python3 script1.py > log1.txt 2>&1 & и nohup python3 script2.py > log2.txt 2>&1 &. При использовании screen создают отдельные сессии для каждого скрипта, что упрощает мониторинг и управление.
Для контроля работы скриптов в фоне применяются стандартные инструменты Linux: ps aux | grep python для поиска процессов и kill PID для остановки. Комбинация nohup и screen позволяет запускать длительные задачи на сервере без постоянного подключения к терминалу.
Применение планировщика задач cron для автоматического запуска

Для автоматического запуска Python-скриптов на Linux и macOS часто используют планировщик cron. Он позволяет выполнять задачи по расписанию без вмешательства пользователя.
Чтобы настроить cron для запуска скрипта, выполните следующие шаги:
- Откройте терминал и введите команду
crontab -eдля редактирования таблицы задач пользователя. - Добавьте запись в формате
минуты часы день_месяца месяц день_недели команда. Например, для запуска скрипта/home/user/script.pyкаждый день в 3:30:
30 3 * * * /usr/bin/python3 /home/user/script.py - Сохраните изменения и выйдите из редактора. Cron автоматически применит новое расписание.
Для запуска нескольких скриптов одновременно можно:
- Создать отдельные cron-записи для каждого скрипта с одинаковым временем запуска.
- Создать один shell-скрипт, который запускает несколько Python-файлов параллельно через
&, и вызывать его из cron:
/bin/bash /home/user/run_all.sh
Рекомендуется указывать полный путь к интерпретатору Python и к скриптам, чтобы избежать ошибок из-за различий в окружении cron и интерактивного терминала.
30 3 * * * /usr/bin/python3 /home/user/script.py >> /home/user/script.log 2>&1. Это позволяет отслеживать выполнение и выявлять ошибки.
Проверить текущие задачи cron можно командой crontab -l. Для удаления задачи используют crontab -r.
Контроль завершения и логирование работы нескольких процессов

Пример с multiprocessing: создайте объекты Process для каждого скрипта, вызовите start(), затем join() для синхронного ожидания завершения. Если нужен асинхронный контроль, проверяйте is_alive() в цикле и сохраняйте состояние в лог.
Для логирования применяйте модуль logging. Создайте отдельный лог-файл для каждого процесса или общий с указанием имени процесса. Используйте уровни INFO, WARNING, ERROR для фиксации успешного выполнения, предупреждений и исключений.
Рекомендуется добавлять отметку времени к каждому событию в логах и использовать уникальные идентификаторы процессов. Это облегчает корреляцию событий и выявление зависаний при одновременном запуске десятков скриптов.
Вопрос-ответ:
Можно ли запускать несколько Python-скриптов одновременно через стандартный терминал?
Да, для этого можно открыть несколько окон терминала и запустить скрипты отдельно, либо использовать команду с амперсандом (&) в Linux и macOS, чтобы запускать процессы в фоне. Например, команда python script1.py & python script2.py & позволит выполнять оба скрипта одновременно. В Windows можно использовать команду start python script1.py для каждого скрипта.
Как использовать модуль subprocess для одновременного запуска нескольких скриптов?
Модуль subprocess позволяет создавать новые процессы из Python. Для запуска нескольких скриптов можно создать несколько процессов с помощью subprocess.Popen. Например, можно написать цикл, который перебирает список скриптов и запускает каждый через Popen, сохраняя объекты процессов в список для контроля их выполнения. Это позволит скриптам работать параллельно, не дожидаясь завершения предыдущего.
Можно ли использовать threading для одновременного выполнения Python-скриптов?
Модуль threading в Python позволяет выполнять функции параллельно в рамках одного процесса, но не запускает отдельные интерпретаторы Python. Если задача связана с CPU-интенсивными вычислениями, потоки могут не дать прироста скорости из-за глобальной блокировки интерпретатора (GIL). Для запуска полностью независимых скриптов лучше использовать subprocess или multiprocessing.
Как автоматизировать запуск нескольких скриптов на Windows без ручного открытия терминала?
Можно создать батч-файл (.bat), в котором прописаны команды для запуска каждого скрипта через start python script.py. При запуске этого файла все скрипты откроются в отдельных окнах и будут выполняться одновременно. Такой способ удобен для повторяющихся задач или когда нужно запускать несколько скриптов по расписанию через Планировщик заданий.
Есть ли способ ограничить количество одновременно выполняемых скриптов?
Да, можно использовать модуль concurrent.futures с ProcessPoolExecutor, задавая максимальное число рабочих процессов. Это позволяет запускать одновременно ограниченное количество скриптов, а остальные будут ждать своей очереди. Такой подход помогает избежать перегрузки системы, особенно если скрипты потребляют много ресурсов.
