import random
from multiprocessing import Process, Queue, cpu_count
from time import perf_counter_ns as timer
from montecarlo import (puntsQuadrant, puntsQuadrat, afegeixSentinella,
                        pi_segons, escriuResultats)
import sys

def puntsQuadrant2(punts, resultats):
    resultats.put(puntsQuadrant(punts))

def main(n, nProductors, nConsumidors):
    print('Càlcul Productors punts quadrat- Consumidors cal. punts quadrant')
    np = cpu_count()
    print(f'detectat {np} processadors')
    inici = timer()
    punts = Queue(n)
    resultats = Queue()
    productors = [Process(target=puntsQuadrat,
                          args=(n // nProductors,
                                punts)) for i in range(nProductors)]
    consumidors = [Process(target=puntsQuadrant2,
                           args=(punts,
                                 resultats)) for i in range(nConsumidors)]
    for p in productors + consumidors:
        p.start()
    for p in productors:
        if p.is_alive():
            p.join()
    for i in range(nConsumidors):
        afegeixSentinella(punts)
    for p in consumidors:
        if p.is_alive():
            p.join()
    nc, nq  = 0, 0
    while not resultats.empty():
        n_quadrant, n_quadrat = resultats.get()
        nc += n_quadrant
        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]), int(sys.argv[3]))

