単純なプロデューサーコンシューマーアプリケーションがあります。
プロデューサーはキューにものを書き込むスレッドであり、コンシューマーはキューからメッセージを読み取るスレッドであり、いくつかの点で終了します。
私のプロデューサーはこのように見えます
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)
スレッドがスリープしているという問題ですか?
問題は、プロデューサーループが終了しないことです。そのため、停止するように指示する方法が必要です。
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()