¿Cómo detener el hilo del demonio?

Tengo una aplicación simple para el consumidor productor.

El productor es un hilo que escribe cosas en una cola y un consumidor es un hilo que lee los mensajes de la cola hace cosas y en algunos puntos sale.

Mi productor se ve un poco así

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

y el consumidor

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

En mi principal invoco esos hilos así.

 p = Thread(target=producer) c = Thread(target=consumer) p.daemon = True p.start() c.start() c.join() 

cuando c termina, el único hilo restante no deamon es el principal, ¿cuál es la forma correcta de terminar esos hilos?

actualizar

Aquí está el código exacto que está utilizando mi productor, ya que el consumidor está saliendo y el problema está en el productor

 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) 

¿El problema es que el hilo está durmiendo?

El problema es que el bucle de productor nunca termina, por lo que debe tener una manera de decirle que se detenga.

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

Y el productor se convierte en:

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

Luego, cuando quieras detener al productor simplemente haz:

 stop_event.set()