Ich habe mit zwei Python-Warteschlangen zu tun.
Kurzbeschreibung meiner Frage:
Kunden gehen durch die waiting queue
(q1) und sie (die Kunden) werden danach serviert.
Die Größe der waiting queue
kann nicht größer als N sein (10 in meinem Programm).
Wenn waiting queue
voll wird, werden die Clients an outside queue
(q2, Größe 20) übergeben. Wenn die externe Warteschlange voll wird, werden Clients abgelehnt und nicht bedient.
Jeder Client, der eine Warteschlange verlassen hat, ermöglicht es einem anderen Client von außerhalb der Warteschlange, der Warteschlange beizutreten.Kann Artikel von einer Warteschlange zu einer anderen nicht ausrichten
Arbeiten mit Warteschlangen sollten Thread-sicher sein.
Im Folgenden implementiert ich ungefähr, was ich will. Aber ich bin mit dem Problem konfrontiert - einen Client von außerhalb der Warteschlange (q1) in die Warteschlange (q2) während der Ausführung in die Warteschlange serve
Funktion einreihen. Ich glaube, ich habe etwas Wichtiges verloren oder vergessen. Ich denke, diese Aussage q1.put(client)
blockiert dauerhaft, weiß aber nicht warum.
import time
import threading
from random import randrange
from Queue import Queue, Full as FullQueue
class Client(object):
def __repr__(self):
return '<{0}: {1}>'.format(self.__class__.__name__, id(self))
def serve(q1, q2):
while True:
if not q2.empty():
client = q2.get()
print '%s leaved outside queue' % client
q1.put(client)
print '%s is in the waiting queue' % client
q2.task_done()
client = q1.get()
print '%s leaved waiting queue for serving' % client
time.sleep(2) # Do something with client
q1.task_done()
def main():
waiting_queue = Queue(10)
outside_queue = Queue(20)
for _ in range(2):
worker = threading.Thread(target=serve, args=(waiting_queue, outside_queue))
worker.setDaemon(True)
worker.start()
delays = [randrange(1, 5) for _ in range(100)]
# Every d seconds 10 clients enter to the waiting queue
for d in delays:
time.sleep(d)
for _ in range(10):
client = Client()
try:
waiting_queue.put_nowait(client)
except FullQueue:
print 'Waiting queue is full. Please line up in outside queue.'
try:
outside_queue.put_nowait(client)
except FullQueue:
print 'Outside queue is full. Please go out.'
waiting_queue.join()
outside_queue.join()
print 'Done'