import timeit
import numpy
import datetime
import threading
import tangostationcontrol
from tango import DeviceProxy
from tangostationcontrol.beam.delays import Delays

Antenna_Field_Reference_ITRF_R = numpy.array([3826896.192,  460979.502, 5064658.231])
Antenna_Reference_ITRF_R = numpy.array([[3826885.71898169,  460981.16159554, 5064665.97751092]] * 24)
Pointing_direction_R = numpy.array([["J2000", "0deg", "0deg"]] * 488)

d = Delays(Antenna_Field_Reference_ITRF_R)
d.set_measure_time(datetime.datetime.now())
relative_antenna_positions = Antenna_Reference_ITRF_R - Antenna_Field_Reference_ITRF_R

l = threading.Lock()

def compute_delays():
    #l.acquire()
    d.set_measure_time(datetime.datetime.now())
    _ = d.delays_bulk(Pointing_direction_R, relative_antenna_positions)
    #l.release()

def fun(n,nthreads):
    elapsed=timeit.timeit(compute_delays, number=n)
    print(f"{n} calls in {nthreads} threads cost {elapsed:.2f}s: each call needed {elapsed/n:.2f}s wall clock time")

for nthreads in (1,2,3,4):
    threads = [threading.Thread(target=fun,args=(10,nthreads)) for x in range(nthreads)]
    [t.start() for t in threads]
    [t.join() for t in threads]