Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
А это две из восьми подборок моего канала канала о программировании на языке Python.
Приложение 1 к видеоуроку
Многозадачность. Потоки. Модуль threading
Как я уже говорил в видеоуроке, многозадачность может существовать в рамках одного процесса. Элементами такой многозадачности являются потоки. При создании процесса также в рамках его создаётся один главный поток, исполняющий код программы. Чаще всего нам этого вполне достаточно. Но бывают случаи, когда какие то действия важно выполнять параллельно основному потоку выполнения. Для этого и создаются потоки. Важно отметить, что потоки в рамках одного процесса не изолированы друг от друга. Они могут использовать одни и те же глобальные переменные, одни и те же файлы. Это удобно, но это и опасно, так как может вызвать трудно определяемые ошибки. Для создания и управления потоками в Python есть стандартная библиотека threading. Потоки называют также нитями, по английски threads.
Сегодня мы рассмотрим один важный пример, демонстрирующий некоторые особенности работы с потоками.
Ниже представлена программа, которая создаёт 10 потоков. Потоки создаются на основе одной функции и отличаются друг от друга номером, который передаётся в функцию в качестве параметра. Далее осуществляется закрытие потоков путём изменения глобальной переменной fl.
Сделаем несколько пояснений к программе.
- Создание потока осуществляется методом threading.Thread(). При этом мы указываем имя функции (threa), которая будет выполняться в потоке и параметр, который передаётся ей. В нашем случае параметр равен номеру создаваемого потока.
- В самой функции бесконечный цикл, выход из которого происходит, если глобальная переменная fl становится равной True. В этой связи замечу, что окончание работы потока возможно только если он сам заканчивает свою работу. Другого способа нет. Это и понятно, так как потоки могут выполнять самые разные в том числе и совместные действия, и попытка закончить работу потока извне может привести к катастрофе всей программы.
- После создания потока он должен быть запущен методом start() (см. текст программы).
- Для проверки того, что поток ещё работает используется метод join(). Он ждёт, когда поток закончит работу.
- Все объекты, описывающие потоки, мы поместили в список thr. Это удобно для последующей работы с потоками.
Мы использовали в программе только часть возможностей модуля threading. В следующих приложениях к уроку мы подробно остановимся на других инструментах.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.