1K подписчиков

Программирование на Python. Многозадачность. Потоки. Threading. Ещё об очереди queue

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

Многозадачность в Python | programmer's notes (python and more) | Дзен
dzen.ru

Продолжение статьи о queue.

Использование очереди queue при обмене данными между потоками

Сегодня продолжу материалы по использованию модуля queue для взаимодействия между потоками. Напомню, что очередь работает по принципу "первым пришёл, первым ушёл". В сущности механизм FIFO, который рассматривали в отношении процессов.

Напомню, что для создания объекта очередь используется класс Queue. Рассмотрим его и его методы более подробно.

  • queue.Queue(maxsize=0) — создает объект очередь. При создании можно указать максимальный размер (в записях) очереди. 0 означает, что максимальный размер не ограничен.
  • Queue.qsize() — получить примерный размер очереди. Почему примерный? Да потому что размер может динамически менять, если речь идет о работе с ним потоков.
  • Queue.full() — возвращает True, если очередь заполнена и False, если нет. На момент исполнения, естественно.
  • Queue.put(item, block=True, timeout=None) — помещает в очередь элемент. По умолчанию ждёт, если места в очереди нет. Если указан параметр timeout, то ждёт указанное количество секунда. Если block=False, то в случае, если нет в очереди место, вызывается исключение.
  • Queue.get(block=True, timeout=None) — достать элемент из очереди. Возвращает и удаляет элемент из очереди. Если элемента нет, то метод ждёт, когда он появится. Если указан timeout, то в случае отсутствия элементов ожидание длится указанное количество секунд. Если block=False, то в случае отсутствия элементов вызывается исключение.
  • Queue.task_done() — указывает, что поставленная в очередь задача выполнена.
  • Queue.join() — ожидает пока все элементы в очереди ни будут получены и обработаны (см. Queue.task_done()). Т.е. функция очереди окончена.

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

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

Пояснение к программе.

  • Поток getfr берёт из файла числа и помещает их в очередь. Работа этого потока заканчивается, когда заканчиваются числа в файле. По умолчанию поток будет ждать, если очередь вся заполнена, т.е. ждать, когда второй поток ни освободит хотя бы одно место в очереди.
  • Поток putto берёт доступный элемент (число) из очереди. Остановлен timeout=2. Ну, на всякий пожарный, вдруг второй поток замешкается.

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

"В очередь, сукины дети, в очередь"? (М.А. Булгаков. Собачье сердце)
"В очередь, сукины дети, в очередь"? (М.А. Булгаков. Собачье сердце)