Найти в Дзене
programmer's notes (python and more)

Программирование на Python. Многозадачность. Потоки. Модуль threading

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

А это две из восьми подборок моего канала канала о программировании на языке Python.

programmer's notes (python and more)

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

Многозадачность. Потоки. Модуль threading

Как я уже говорил в видеоуроке, многозадачность может существовать в рамках одного процесса. Элементами такой многозадачности являются потоки. При создании процесса также в рамках его создаётся один главный поток, исполняющий код программы. Чаще всего нам этого вполне достаточно. Но бывают случаи, когда какие то действия важно выполнять параллельно основному потоку выполнения. Для этого и создаются потоки. Важно отметить, что потоки в рамках одного процесса не изолированы друг от друга. Они могут использовать одни и те же глобальные переменные, одни и те же файлы. Это удобно, но это и опасно, так как может вызвать трудно определяемые ошибки. Для создания и управления потоками в Python есть стандартная библиотека threading. Потоки называют также нитями, по английски threads.

Сегодня мы рассмотрим один важный пример, демонстрирующий некоторые особенности работы с потоками.

Ниже представлена программа, которая создаёт 10 потоков. Потоки создаются на основе одной функции и отличаются друг от друга номером, который передаётся в функцию в качестве параметра. Далее осуществляется закрытие потоков путём изменения глобальной переменной fl.

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

Сделаем несколько пояснений к программе.

  1. Создание потока осуществляется методом threading.Thread(). При этом мы указываем имя функции (threa), которая будет выполняться в потоке и параметр, который передаётся ей. В нашем случае параметр равен номеру создаваемого потока.
  2. В самой функции бесконечный цикл, выход из которого происходит, если глобальная переменная fl становится равной True. В этой связи замечу, что окончание работы потока возможно только если он сам заканчивает свою работу. Другого способа нет. Это и понятно, так как потоки могут выполнять самые разные в том числе и совместные действия, и попытка закончить работу потока извне может привести к катастрофе всей программы.
  3. После создания потока он должен быть запущен методом start() (см. текст программы).
  4. Для проверки того, что поток ещё работает используется метод join(). Он ждёт, когда поток закончит работу.
  5. Все объекты, описывающие потоки, мы поместили в список thr. Это удобно для последующей работы с потоками.

Мы использовали в программе только часть возможностей модуля threading. В следующих приложениях к уроку мы подробно остановимся на других инструментах.

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

Ваши потоки мыслей не коррелируют друг с другом
Ваши потоки мыслей не коррелируют друг с другом