import threading
from queue import Queue
import time


impressio = threading.Lock()

def imprimir(item):
    # quan sortim del sangrat, el bloquejador impressio s'allibera
    with impressio:
        for i in range(10):
            print(item)

def impressor(n):
  while True:
    imprimir(q.get())
    q.task_done()  # Notifiquem que hem acabat amb la dada consumida.
                   # important per .join sincronitzar amb l'acabament
    print(f'------------ Fet per Imprenta {n}')
    time.sleep(1)

q = Queue()


if __name__ == '__main__':
    d = {0: 'zero', 1: 'u', 2: 'dos', 3: 'tres', 4: 'quatre', 5: 'cinc',
         6: 'sis', 7: 'set', 8: 'vuit', 9: 'nou'}
    for m in range(10):
        q.put(m)
    for f in range(5):
        fil = threading.Thread(target = impressor, args=(f,))
        fil.daemon = True  # Fil acabarà si principal acaba.
        fil.start()

    q.join() #esperem fils acabin. 
