В потоке (модуль threading) есть основной цикл, который длится секунду.
И вложенный цикл длится 1мс, тут происходит вычисление.
Вычисление значения занимает +-0.1мс, остальное время нужно ждать.
Если делать ожидание через sleep, то количество итераций примерно 830 (+-10).
Если делать через "while timestamp_ns < timestamp_stop_ns:" количество итераций ровно 1000.
Не пойму, это у "sleep" есть какие-то подводные камни или в чем еще может быть дело?
P.s. Важно использовать именно sleep, т к код запускается в отдельном потоке и sleep передает управление eventloop.
Вероятно, именно на передачу и расходуются недостающие ресурсы, но как в таком случае быть? multiprocessing?
step_timestamp_ns = time_ns()
step_start_ns = time_ns()
step_stop_ns = step_start_ns + step.duration_ns
while step_timestamp_ns < step_stop_ns:
timestamp_ns = time_ns()
# timestamp_stop_ns = timestamp_ns + 1_000_000
lock.acquire()
for message in self._instant_values:
for sig_name, cur_value in self._instant_values[message].items():
if sig_name in step.monitored_signals:
signal = step.monitored_signals[sig_name]
value = self.__get_value_for_signal()
self._instant_values[message][sig_name] = value
lock.release()
data = deepcopy(self._instant_values)
self._logged_data.setdefault(timestamp_ns, data)
time_for_sleep = (1_000_000 - (time_ns() - timestamp_ns)) / 1_000_000_000
sleep(time_for_sleep)
# while timestamp_ns < timestamp_stop_ns:
# timestamp_ns = time_ns()
step_timestamp_ns = time_ns()
count += 1
step_index += 1
print(count)