Обеспечение очереди python, которая может быть заполнена несколькими потоками, всегда будет очищаться без опроса - PullRequest
1 голос
/ 03 апреля 2020

У меня есть код ниже, который показывает, как очередь всегда будет очищаться даже при добавлении в очередь нескольких потоков. Он использует рекурсию, но некоторое время l oop тоже может сработать. Это плохая практика или будет сценарий, когда в очереди может быть объект, и он не будет извлечен, пока что-то не будет добавлено в очередь.

Основная цель этого состоит в том, чтобы иметь очередь, которая обеспечивает порядок выполнения без необходимости постоянно опрашивать или блокировать с помощью q.get ()

import queue
import threading
lock = threading.RLock()
q = queue.Queue()

def execute():
    with lock:
        if not q.empty():
            text = q.get()
            print(text)
            execute()


def add_to_queue(text):
    q.put(text)
    execute()

# Assume multiple threads can call add to queue
add_to_queue("Hello")

1 Ответ

1 голос
/ 04 апреля 2020

Это одно решение, которое использует тайм-аут в функции .get, одно выдвигает в очередь, а другое читает из очереди. Вы можете иметь несколько читателей и писателей.

import queue
import threading
q = queue.Queue()

def read():
    try:
        while True:
            text = q.get(timeout=1)
            print(text)
    except queue.Empty:
        print("exiting")

def write():
    q.put("Hello")
    q.put("There")
    q.put("My")
    q.put("Friend")

writer = threading.Thread(target=write)
reader = threading.Thread(target=read)

writer.start()
reader.start()

reader.join()
...