Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль

Python. Очереди.

Запись от Фаер размещена 10.10.2012 в 21:20
Показов 11758 Комментарии 0

Теперь, когда Мы разобрались с параллельными потоками и процессами, можно поговорить и о взаимодействии между ними. При одновременном обращении нескольких потоков к одному объекту чаще всего происходит его порча. Нам это не нужно. А значит, требуется организовать нечто, способное блокировать доступ потоков к объекту с целью последовательного выполнения их запросов. Как раз такое нечто находится в модуле queue, который содержит в себе три класса-очереди.

Думаю, всем известно, что такое очередь. С точки зрения информатики её основной принцип трактуется как "первый пришёл, первый ушёл". Вот эту самую очередь Мы сейчас и организуем:

Python
1
2
3
4
5
6
7
from queue import Queue
q=Queue()
for i in (3,5,1):
    q.put(i)
for i in range(0,3):
    print(q.get())
input()
Скрипт выполняет следующие действия: конструирует экземпляр класса Queue(), заносит в него три числа(метод put()), затем эти числа достаёт обратно(get()), причём каждое считанное число автоматически удаляется из очереди. Объекты выгружаются в таком порядке: первый занесён в очередь - первый из неё взят, второй занесён - второй взят. Всё просто.

Теперь давайте используем очередь для организации передачи данных между потоками:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from queue import Queue
from time import sleep
from threading import Thread
from random import randint
sp1=[];sp2=[]
q=Queue()
def f1():
    for i in range(1,6):
        sleep(0.5)
        s=randint(1,10)
        sp1.append(s)
        q.put(s)
def f2():
    for i in range(1,6):
        sleep(1)
        t=q.get()
        sp2.append(t)
th1=Thread(target=f1,args=())
th2=Thread(target=f2,args=())
th1.start()
th2.start()
th2.join()
print(sp1)
print(sp2)
input()
Функция f1() генерирует элементы и заносит их в очередь и список sp1.
Функция f2() читает элементы из очереди и заносит их в список sp2.

Не взирая на то, что функции выполняются в разных потоках и с разной скоростью(к тому времени, как f2() надумает читать 3-ий элемент, f1() занесёт в очередь уже 5-ый), Вы получите два совершенно одинаковых списка.
Таким образом, очередь позволяет одному потоку генерировать новые числа и при это сохранять старые, а второму читать числа, которые были сгенерированы 2-3 итерации назад. Заметьте, что экземпляр класса Queue() автоматически становится глобальным, что очень удобно.

Как Вы уже, пожалуй, догадались, следующим шагом Мы разберём стек. Если в очереди первый пришёл, первый ушёл, то в стеке всё наоборот: первый пришёл, последний ушёл. Для большей ясности возьмём скрипт без потоков, но имейте в виду, что стек работает с ними не хуже очереди.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from queue import LifoQueue
from time import sleep
from random import randint
sp1=[];sp2=[]
q=LifoQueue()
def f1():
    for i in range(1,6):
        s=randint(1,10)
        sp1.append(s)
        q.put(s)
def f2():
    for i in range(1,6):
        t=q.get()
        sp2.append(t)
f1()
f2()
print(sp1)
print(sp2)
input()
После выполнения скрипта в консоли окажутся два списка:

1-ый: показывает в каком порядке числа были сгенерированы и занесены в стек.
2-ой: в каком порядке числа были считаны.
Второй список будет состоять из расположенных в обратном порядке элементов первого(первый элемент, занесённый в стек, будет прочитан последним, второй - предпоследним и т.д.).

Кроме очереди и стека модуль queue содержит ещё один "очередной" класс PriorityQueue(). В этой очереди, как видно из её имени, главенствуют высокоприоритетные объекты.
Чем ниже число, указывающее приоритет, тем приоритет выше.

Хотелось бы сразу сделать замечание:
Если Вы заносите в очередь один элемент, то приоритет определяется автоматически: число "1" -по приоритету будет выше 2-ки, строка 'slider' выше, чем 'spider' и т.д. В некоторых случаях это может быть неудобно, поэтому советую Вам передавать в очередь кортеж, где первым элементом будет число - приоритет:

Python
1
2
3
4
5
6
7
8
from queue import PriorityQueue
q=PriorityQueue()
q.put((2,'glider'))
q.put((3,'slider'))
q.put((1,'spider'))
for i in range(0,3):
    print(q.get()[1])
input()
В консоли появятся три надписи:
spider
glider
slider

выведенные в порядке, заданном приоритетами. Не забывайте ставить двойные скобки при вызове метода q.put(), ведь Вы передаёте кортеж(tuple), а не два отдельных элемента.

Очереди являются, пожалуй, самым надёжным методом организации "общения" между потоками, да и вообще, по хозяйству могут пригодиться. Поэтому не следует ими пренебрегать, тем более, что разобраться в них совсем не трудно.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru