Подождите, если выполнение кода завершится до истечения срока, и прервите его, если не завершено sh в пределах лимита - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть для l oop, и мне нужно, чтобы каждая итерация занимала ровно 5 миллисекунд. то есть, если код завершается до 5 миллисекунд, итерация должна ждать до 5 миллисекунд, а если она занимает более 5 миллисекунд, l oop должен игнорировать ее и go до следующей итерации.

I пробовал этот код, но он не точный, и он не помогает прервать следующую итерацию, если она занимает больше времени

import time

for i in range(N):
    now = time.time_ns()
    do_something(i)
    time.sleep(0.005 - (time.time_ns() - now -3)*1e-9)

Я использовал time_ns (), так как предполагал, что он будет более точным, чем time () но это не очень помогло

1 Ответ

1 голос
/ 14 февраля 2020

Сохраните время инициализации в начале

и используйте его в своих вычислениях. Вот мой пример

import random
import time

N = 10
D = 0.5
T0 = time.time()

def do_something(msg):
    """Sleep 0 to 1 seconds"""
    time.sleep(random.random())
    print(msg)

for i in range(N):
    # check if we're overtime
    if T0 + (i+1)*D < time.time():
        continue

    do_something(i)

    # use modulo to compute sleep duration
    time.sleep(
        D - (time.time() - T0) % D
    )

И вывод. Обратите внимание, что некоторые числа отсутствуют, и что это занимает 10 × 0,5 = 5 секунд.

$ time python3 aly.py 
0
1
3
5
6
8

real    0m5.030s
user    0m0.028s
sys     0m0.004s

О time_ns : time.sleep нужно с плавающей запятой , поэтому использование целых наносекунд бессмысленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...