from multiprocessing import Process, Queue, cpu_count
from time import perf_counter_ns as timer
from montecarlo import (puntsQuadrantQuadrat, pi_segons, escriuResultats)
import sys

def puntsQuadrantQuadrat2(n, resultats):
    resultats.put(puntsQuadrantQuadrat(n))

def main(n, nProcessos):
    print('Càlcul mitjançant comunicació resultats en una cua compartida')
    np = cpu_count()
    print(f'detectat {np} processadors')
    inici = timer()
    resultats = Queue()
    processos = [Process(target=puntsQuadrantQuadrat2,
                         args=(n // nProcessos,
                               resultats)) for i in range(nProcessos)]
    for p in processos:
        p.start()
    for p in processos:
        if p.is_alive():
#            print('esperant procés ', p.name)
            p.join()
    nc, nq  = 0, 0
    while not resultats.empty():
        n_cercle, n_quadrat = resultats.get()
        nc += n_cercle
        nq += n_quadrat
    pi = pi_segons(nc, nq)
    fi = timer()
    escriuResultats(inici, fi, pi)

if __name__=='__main__':
    main(int(sys.argv[1]), int(sys.argv[2]))
