Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Продолжение статьи о 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.