queue.get
не является функцией блокировки, она просто ждет, пока в очереди не появится элемент, если очередь пуста.Из вашего кода я вижу, что queue.get
идеально подходит для вашего случая использования внутри цикла while.
Я думаю, что вы, вероятно, используете его неправильно.Вам нужно сделать функцию worker
сопрограммой (синтаксис async
/ await
):
async def worker():
...
while True:
message = await queue.get()
...
Однако, если вы не хотите ждать элемента ихотел бы продолжить немедленно, его альтернатива - queue.get_nowait
.
Следует отметить, что queue.get_nowait
вызовет исключение под названием QueueEmpty
, еслиочередь пустаИтак, вам нужно обработать это исключение.
Пример:
while True:
try:
message = queue.get_nowait()
except QueueEmpty:
# wait for some time before
# next iteration
# otherwise this loop will
# keep running for no reason
MyWebSocket.emit(message)
Как вы можете видеть, вам придется использовать цикл паузы в течение некоторого времени, если очередь пуста, чтобы предотвратить перегрузку системы.
Так почему бы не использовать queue.get
во-первых?