web-dev-qa-db-ja.com

デーモンスレッドを停止するには?

単純なプロデューサーコンシューマーアプリケーションがあります。

プロデューサーはキューにものを書き込むスレッドであり、コンシューマーはキューからメッセージを読み取るスレッドであり、いくつかの点で終了します。

私のプロデューサーはこのように見えます

def producer(queue):
    while not queue.full():
        queue.put(randint(1, 199))

そして消費者

def consumer(queue):
    for i in range(100):
        print(queue.get())
        queue.task_done()

私のメインでは、そのようなスレッドを呼び出します

p = Thread(target=producer)
c = Thread(target=consumer)

p.daemon = True
p.start()
c.start()
c.join()

cが終了すると、残りのデーモン以外のスレッドがメインである場合、それらのスレッドを終了する適切な方法は何ですか?

更新

これは、コンシューマが終了していて問題がプロデューサにあるため、私のプロデューサが使用している正確なコードです

def generate_random_alphanumerics(msg_queue):
    while True:
        if not msg_queue.full():
            msg_queue.put(hashlib.sha1(bytes(randint(1, 10000))).hexdigest() * 10)
        else:
            sleep(0.01)

スレッドがスリープしているという問題ですか?

8
LetsPlayYahtzee

問題は、プロデューサーループが終了しないことです。そのため、停止するように指示する方法が必要です。

stop_event= threading.Event()
p = Thread(target=producer, args=(msg_queue, stop_event))
p.start()

そしてプロデューサーは次のようになります:

def generate_random_alphanumerics(msg_queue, stop_event):
    while not stop_event.is_set():
        if not msg_queue.full():
            [...]

次に、プロデューサーを停止する場合は、次のようにします。

stop_event.set()
15
enrico.bacis