2015-11-12 3 views
2

Я построил следующий код, изучая потоки и очереди из следующих website.Алгоритм «Продюсер-потребитель» в python

from __future__ import print_function 
import queue 
import threading 
import time 

class a3_4(threading.Thread): 
    q = queue.Queue() 
    def __init__(self, begin, end, waiting_time): 
     self.begin = begin 
     self.end = end 
     self.waiting_time = waiting_time 
     threading.Thread.__init__(self) 

    def run(self): 
     while True: 
      if self.begin != self.end: 
       self.q.put(self.begin) 
       self.begin += 1 
       time.sleep(5) 
      else: 
       break 
    def op(self): 
     self.start() 
     while True: 
      if not self.q.empty(): 
       print("Outputting: ", self.q.get()) 
      time.sleep(self.waiting_time) 

if __name__ == '__main__': 
    myThread = a3_4(1, 5, 1) 
    myThread.op() 

я получаю следующий результат:

python3 a3_4.py 
Outputting: 1 
Outputting: 2 
Outputting: 3 
Outputting: 4 

Но программа не останавливается на своих собственных. Я пробовал вставлять else: break но это только дает мне Outputting: 1 Я пропустил что-то очень основное здесь?

ответ

1

Я думаю, вы имитируете проблему производителя-потребителя. Проблема в том, что поток вашего производителя останавливается должным образом, но для вашего потребительского потока (основного потока) нет предложения о прекращении. Поэтому я думаю, что вам нужно добавить предложение о прекращении для вашего потребительского метода op().

Может быть:

def op(self): 
     self.start() 
     while True: 
      time.sleep(self.waiting_time) 
      if not self.q.empty(): 
       print("Outputting: ", self.q.get()) 
      else: 
       break 
+0

Я также удалил строку 19. В противном случае только первый выход распечатана –

+0

По линии не 19, какая линия вы имеете в виду? –

+0

Решена ли ваша проблема сейчас? –

 Смежные вопросы

  • Нет связанных вопросов^_^