Как создать очередь, которая выводит свои содержания, элемент за элементом, с заданным интервалом времени, не останавливая программу? - PullRequest
0 голосов
/ 16 декабря 2011

Мне нужно создать очередь, которая выскакивает свои элементы в заданный интервал времени.
И вот в чем загвоздка: это действие должно выполняться в фоновом режиме, поэтому оно не остановит выполнение программы, пока очередь не станет пустой..
Вот так выглядит моя очередь на данный момент:

from collections import deque

class Queue():

    def __init__(self, sec):
        self.sec = sec
        self.q = deque()
        # start a timer that triggers
        # pop_item() every 'sec' seconds

    def add_item(self, item):
        self.q.append(item)

    def pop_item(self):
        item = self.q.popleft()
        print(item)

q1 = Queue(5)
q1.add_item('A')
q1.add_item('B')
q1.add_item('C')

В этом примере я создаю новую очередь (q1) с интервалом 5 секунд и добавляю 3 элемента.
В момент создания экземпляра q1 он должен начать выводить свое содержимое без остановки программы каждые 5 секунд.
Очередь не ограничивается только одним экземпляром.Будет много экземпляров, каждый со своим интервалом времени для вывода своего содержимого.

Все, что я мог сделать, это таймер, который останавливает основную программу, так что это не то, что мне нужно.

Может кто-нибудь предложить решение этой проблемы?

Спасибо.

1 Ответ

1 голос
/ 16 декабря 2011

Как отметили два человека, которые прокомментировали ваш вопрос, немедленным ответом было бы использование потоков, лишь бы вы упомянули, что будет много экземпляров, а множество экземпляров - разумная сумма.Что-то вроде следующего:

import threading
import Queue
import time

class QueuePrinter(threading.Thread):
  def __init__(self, qu, *args, **kwargs):
    super(QueuePrinter, self).__init__(*args, **kwargs)
    self.qu = qu
  def run(self):
    while not self.qu.empty():
      item = self.qu.get()
      print item
      time.sleep(2)

qu = Queue()
printer = QueuePrinter(qu)
qu.put('String1')
qu.put('String2')
#etc...
printer.start()
qu.join()

Вы захотите немного улучшить это;но это основы того, что вы должны придерживаться.В частности, вы захотите изменить метод run (), чтобы он работал правильно, а метод get () вызывался в очереди, находящейся там, потому что Queue.get является блокирующим вызовом и будет ждать, пока он не сможет получить элемент.

Предоставление self.qu.get (timeout = 100) вызовет исключение, но это означает, что поток не будет зависать до конца времени, если очередь очищается между self.qu.empty () ифактическая загрузка элемента из очереди.

...