Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
А это подборки моих материалов на канале
Приложение 1 один к видеоуроку
Многозадачность на Python и библиотека os
Подробнее о многозадачности я расскажу в одном из видеоуроков. В данной же статье, я просто дам текстовый вариант к видеоуроку 15.
Когда в программировании возникает многозадачность? Всё очень просто. Если я написал программу и запустил её, то в операционной системе появился объект, который называют процессом. Если же данный процесс может создавать другие объекты, которые также будут исполняться, то мы говорим о многозадачности. Это очень примитивное определение, но нам пока этого достаточно. Та программа, которая запускает другой процесс обычно называется родительской, а процесс, который порожден программой-родителем, называется дочерним.
В библиотеке os есть целый набор функций для многозадачности. В видеоуроке были показаны далеко не все. Но в следующем приложении я постараюсь восполнить этот пробел.
В библиотеке os есть целая группа функций начинающихся с exec. На рисунке ниже эти функции перечисляются.
Смысл суффиксов после имени exec следующие:
- l — запускаемой программы перечисляются как параметры функции. Первый параметр функции путь к запускаемому файлу.
- e — добавляется параметр env, словарик содержащий строки окружения.
- p — первым параметром указывается имя запускаемого файла. Сам же файл ищется в каталогах указанных в строке PATH окружения.
- v — параметры запускаемой программы указывается как элементы списка или кортежа.
Важно! Первым параметром всегда идёт путь к запускаемой программе или просто не значащее значение. А далее уже идут значимые параметры.
Ниже приведён пример запуска программы. Предполагается, что максимальное количество параметров два.
Взята функция execvp(), в которой параметры передаются списком.
Важное замечание.
Особенности работы перечисленных функций заключаются в том, что запускаемая программа замещает запускающую программу. Т.е. команды, которые идут после функции exec выполняться не будут.
Следующая функция более проста. Это функция system(). Она принимает строку запуска как строковое значение. С помощью неё удобно выполнять какие-то команды операционной системы. Важно отметить, что после выполнения команды, управление возвращается в запускающую программу. При этом команды, которые идут после system() выполняются только после того, как system() вернёт управление.
Ниже представлен пример использование system().
И наконец группа функций span, с такими же префиксами что и exec. Но в этой функции есть еще дополнительный параметр впереди остальных. Он указывает на режим выполнения функции.
Есть два основных режима: os.P_NOWAIT — не ждать, т.е. после запуска указанной программы управление возвращается в основную, родительскую и две программы выполняются параллельно. os.P_WAIT - в этом случае управление в запускающую программу возвращается только после того, как запущенная программа выполнит все свои действия.
В пример ниже показано как происходит выполнение в обоих случаях.
Результат выполнения программы на картинке ниже.
Мы рассмотрели три возможности запускать из одной программы другую. Но есть важные нюансы, которые мы рассмотрим в следующих уроках. Во-первых, как настроить параллельное выполнения запускающей программы (родительской) и запускаемой (дочерней). Речь идет о взаимодействии их друг с другом. Во-вторых, как получать данные от дочернего процесса, если он выводит их на стандартное устройство. Интересные вопросы и мы их подробнейшим образом разберём.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.