Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Приложение 4 (Приложение 1, Приложение 2, Приложение 3) к видео
Использование класса queue для сохранения данных от потоков
В языке Python есть стандартный модуль queue, с помощью которого можно легко организовать такую структуру, как очередь. Очередь очень удобна для хранения данных от различных потоков.
Замечание
Конечно очередь легко реализовать с помощью списка, используя list.append() и list.pop(0). Но я намерен посвятить отдельную статью созданию различного рода структур дан на основе уже существующих. Однако рассматриваемый модуль обладает возможностью работы с потоками. В частности блокировки операций в определённых задачах, это важный инструмент.
Модуль содержит ключевой класс Queue и два метода: put() - отправит в очередь, get() - извлечь из очереди, empty() - определяет, не пуста ли очередь. Как известно, очередь действует по принципу "первым пришёл, первым ушёл". Таким образом мы всегда будем получать данное, которое было отправлено в очередь раньше всех.
Ниже представлена программа, создающая некоторое количество потоков. Каждый из потоков помещает результат вычисления в очередь. В основном потоке выводятся результаты вычислений в порядке создания потоков. Для объекта Queue работает режим блокировки, т.е. если объём очереди ограничен, то вставка туда возможна, если есть место. Другими словами put() будет ожидать место в очереди. В нашем случае по умолчанию размер очереди неограничен.
В дальнейшем мы вернёмся к очереди блокировкой.
Результат выполнения программы
Ждём окончания работы всех потоков
[0, 0]
[1, 1]
[2, 2]
[4, 3]
[13, 4]
[14, 5]
[3156, 6]
[1330, 7]
[167699, 8]
[14906, 9]
[4100, 10]
[667404, 11]
[389200384, 12]
[435043694, 13]
[10217763427, 14]
[33221078, 15]
[9056422843121, 16]
[26251942853806, 17]
[10034630346359495, 18]
[100550600, 19]
Замечание
Отметим, что извлечение из очереди осуществляется в основном потоке, когда все другие потоки закончили свою работу. Кроме того, нам не важно в каком порядке помещаются данные в очередь, так как в конце всё равно все данные сортируются в порядке запуска потоков.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.