Доброго времени суток, читатели, зрители моего канала 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 появятся. Но в том, варианте, который представлен здесь, всё должно работать одинаково для разных операционных систем.
Ниже представлено приложение, которое я рассматривал на видеоуроке, с добавленными туда комментариями.
При запуске на консоль в начале появятся строки (благодаря задержке time.sleep(2) , во время которой и выполняется вывод из дочернего и родительского процессов)
Родительский процесс
Дочерний процесс
В конце вывода
Дочерний процесс завершен (из дочернего)
Дочерний процесс завершен (из родительcкого)
В библиотеке os есть еще одна функция wait(). Она ждёт, когда закончится любой дочерний процесс и возвращает кортеж, первым элементом которого является идентификатор дочернего процесса.
Следующий пример демонстрирует работу этой функции.
Программа создаёт n дочерних процессов. В родительском процессе отслеживается окончание работы каждого из процессов.
Например для n = 5 получаем
И так, с многозадачностью мы не прощаемся и на ждёт ещё много интересного в этой области.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.