Найти тему

Программирование на Python. Элементы многозадачности в os. Функция fork. Приложение к видео 16

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

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

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

Python. Управление многозадачностью. Функция fork

Это первое приложение к видеоуроку о функции fork(), позволяющей создавать дочерние приложения, выполняющиеся параллельно родительским и получающие от родительского приложения определённые до выполнения функции fork() копии переменных.

Для создания дочернего процесса пишем

id = os.fork()

В этой точке появляется дочерний процесс. При этом:

  • дочерний процесс получает копии всех переменных, определённых в родительском процессе до вызова функции fork();
  • при этом в дочернем процессе id равен 0, в родительском процессе id равен идентификатору дочернего процесса, что позволяет контролировать выполнение дочернего процесса.

Сложность понимания работы функции fork() заключается в том, что программы вроде бы один, а выполняют её два процесса. Конечно, это дело практики, постепенно к такой структуре привыкаешь.

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

os.waitpid(id, 0)

Мы видим, что первым параметром функции является идентификатор процесса, который был получен родительским процессом при выполнении функции fork(). Значение id > 0. Чтобы пока не перегружать вас информацией, а отложу другие возможные значения первого параметра (и вторых тоже) до момента, когда я прочту не большую лекцию о многозадачности в Linux. Да, в этом случае различия от Windows появятся. Но в том, варианте, который представлен здесь, всё должно работать одинаково для разных операционных систем.

Ниже представлено приложение, которое я рассматривал на видеоуроке, с добавленными туда комментариями.

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

При запуске на консоль в начале появятся строки (благодаря задержке time.sleep(2) , во время которой и выполняется вывод из дочернего и родительского процессов)

Родительский процесс
Дочерний процесс

В конце вывода

Дочерний процесс завершен (из дочернего)
Дочерний процесс завершен (из родительcкого)

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

Следующий пример демонстрирует работу этой функции.

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

Программа создаёт n дочерних процессов. В родительском процессе отслеживается окончание работы каждого из процессов.

Например для n = 5 получаем

Результат работы программы
Результат работы программы

И так, с многозадачностью мы не прощаемся и на ждёт ещё много интересного в этой области.

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

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