私は単純な生産者/消費者アプリケーションを持っています。
プロデューサーはキューにデータを書き込むスレッドであり、コンシューマーはキューからメッセージを読み取るスレッドであり、ある時点で終了します。
私のプロデューサーは少しこのように見えます
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()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加