Grigoriev1991
@Grigoriev1991

Как выдерживать паузу в цикле ровно в 1 мс?

В потоке (модуль 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)
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade
Просто хочу быть счастливым
sleep очень вряд-ли будет спать ровно столько сколько запросил из-за накладных расходов.

Из документации:
- The suspension time may be longer than requested by an arbitrary amount, because of the scheduling of other activity in the system

Ты написал итераций примерно 830. Собственно вот и результат - sleep ожидает больше чем нужно и кол-во итераций логики меньше.

Можно сделать комбинированный вариант - заснуть на поменьше, а оставшееся время активно ожидать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы