Python. Очереди.
Запись от Фаер размещена 10.10.2012 в 21:20
Показов 11640
Комментарии 0
|
Теперь, когда Мы разобрались с параллельными потоками и процессами, можно поговорить и о взаимодействии между ними. При одновременном обращении нескольких потоков к одному объекту чаще всего происходит его порча. Нам это не нужно. А значит, требуется организовать нечто, способное блокировать доступ потоков к объекту с целью последовательного выполнения их запросов. Как раз такое нечто находится в модуле queue, который содержит в себе три класса-очереди. Думаю, всем известно, что такое очередь. С точки зрения информатики её основной принцип трактуется как "первый пришёл, первый ушёл". Вот эту самую очередь Мы сейчас и организуем:
Теперь давайте используем очередь для организации передачи данных между потоками:
Функция f2() читает элементы из очереди и заносит их в список sp2. Не взирая на то, что функции выполняются в разных потоках и с разной скоростью(к тому времени, как f2() надумает читать 3-ий элемент, f1() занесёт в очередь уже 5-ый), Вы получите два совершенно одинаковых списка. Таким образом, очередь позволяет одному потоку генерировать новые числа и при это сохранять старые, а второму читать числа, которые были сгенерированы 2-3 итерации назад. Заметьте, что экземпляр класса Queue() автоматически становится глобальным, что очень удобно. Как Вы уже, пожалуй, догадались, следующим шагом Мы разберём стек. Если в очереди первый пришёл, первый ушёл, то в стеке всё наоборот: первый пришёл, последний ушёл. Для большей ясности возьмём скрипт без потоков, но имейте в виду, что стек работает с ними не хуже очереди.
1-ый: показывает в каком порядке числа были сгенерированы и занесены в стек. 2-ой: в каком порядке числа были считаны. Второй список будет состоять из расположенных в обратном порядке элементов первого(первый элемент, занесённый в стек, будет прочитан последним, второй - предпоследним и т.д.). Кроме очереди и стека модуль queue содержит ещё один "очередной" класс PriorityQueue(). В этой очереди, как видно из её имени, главенствуют высокоприоритетные объекты. Чем ниже число, указывающее приоритет, тем приоритет выше. Хотелось бы сразу сделать замечание: Если Вы заносите в очередь один элемент, то приоритет определяется автоматически: число "1" -по приоритету будет выше 2-ки, строка 'slider' выше, чем 'spider' и т.д. В некоторых случаях это может быть неудобно, поэтому советую Вам передавать в очередь кортеж, где первым элементом будет число - приоритет:
spider glider slider выведенные в порядке, заданном приоритетами. Не забывайте ставить двойные скобки при вызове метода q.put(), ведь Вы передаёте кортеж(tuple), а не два отдельных элемента. Очереди являются, пожалуй, самым надёжным методом организации "общения" между потоками, да и вообще, по хозяйству могут пригодиться. Поэтому не следует ими пренебрегать, тем более, что разобраться в них совсем не трудно. | ||||||||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


