Найти тему
programmer's notes (python and more)

Программирование на Python. Элементы многозадачности в os (exec, spawn, system). Приложение к видео 15

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

А это подборки моих материалов на канале

Приложение 1 один к видеоуроку

Многозадачность на Python и библиотека os

Подробнее о многозадачности я расскажу в одном из видеоуроков. В данной же статье, я просто дам текстовый вариант к видеоуроку 15.

Когда в программировании возникает многозадачность? Всё очень просто. Если я написал программу и запустил её, то в операционной системе появился объект, который называют процессом. Если же данный процесс может создавать другие объекты, которые также будут исполняться, то мы говорим о многозадачности. Это очень примитивное определение, но нам пока этого достаточно. Та программа, которая запускает другой процесс обычно называется родительской, а процесс, который порожден программой-родителем, называется дочерним.

В библиотеке os есть целый набор функций для многозадачности. В видеоуроке были показаны далеко не все. Но в следующем приложении я постараюсь восполнить этот пробел.

В библиотеке os есть целая группа функций начинающихся с exec. На рисунке ниже эти функции перечисляются.

Функции exec() библиотеки os
Функции exec() библиотеки os

Смысл суффиксов после имени exec следующие:

  • l — запускаемой программы перечисляются как параметры функции. Первый параметр функции путь к запускаемому файлу.
  • e — добавляется параметр env, словарик содержащий строки окружения.
  • p — первым параметром указывается имя запускаемого файла. Сам же файл ищется в каталогах указанных в строке PATH окружения.
  • v — параметры запускаемой программы указывается как элементы списка или кортежа.

Важно! Первым параметром всегда идёт путь к запускаемой программе или просто не значащее значение. А далее уже идут значимые параметры.

Ниже приведён пример запуска программы. Предполагается, что максимальное количество параметров два.

Текст программы см. ниже
Текст программы см. ниже
primer91.py

Взята функция execvp(), в которой параметры передаются списком.

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

Следующая функция более проста. Это функция system(). Она принимает строку запуска как строковое значение. С помощью неё удобно выполнять какие-то команды операционной системы. Важно отметить, что после выполнения команды, управление возвращается в запускающую программу. При этом команды, которые идут после system() выполняются только после того, как system() вернёт управление.

Ниже представлен пример использование system().

Текст программы см. ниже
Текст программы см. ниже
primer92.py

И наконец группа функций span, с такими же префиксами что и exec. Но в этой функции есть еще дополнительный параметр впереди остальных. Он указывает на режим выполнения функции.

Есть два основных режима: os.P_NOWAIT — не ждать, т.е. после запуска указанной программы управление возвращается в основную, родительскую и две программы выполняются параллельно. os.P_WAIT - в этом случае управление в запускающую программу возвращается только после того, как запущенная программа выполнит все свои действия.

В пример ниже показано как происходит выполнение в обоих случаях.

Текст программы см. ниже
Текст программы см. ниже
primer93.py

Результат выполнения программы на картинке ниже.

Результат вывода последней программы
Результат вывода последней программы

Мы рассмотрели три возможности запускать из одной программы другую. Но есть важные нюансы, которые мы рассмотрим в следующих уроках. Во-первых, как настроить параллельное выполнения запускающей программы (родительской) и запускаемой (дочерней). Речь идет о взаимодействии их друг с другом. Во-вторых, как получать данные от дочернего процесса, если он выводит их на стандартное устройство. Интересные вопросы и мы их подробнейшим образом разберём.

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Я не могу одновременно писать программу и думать
Я не могу одновременно писать программу и думать