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

Python. Очереди.

Запись от Фаер размещена 10.10.2012 в 21:20
Показов 11640 Комментарии 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
Комментарии
 
Новые блоги и статьи
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru