Python 帮助在准确的时间运行几行代码

Python 帮助在准确的时间运行几行代码,python,Python,我刚开始学习python,在过去的两天里,我一直在寻找答案。我想添加代码,使其能够暂停脚本(而不是结束脚本),然后在准确的时间运行下面的几行。例如,如果我想让它暂停到晚上10:40,我需要它精确到毫秒。示例:2021 2 21 22 40 00 年月日时分秒毫秒 我得到的最接近它的代码没有准确地执行它,大多数时间都有一秒或更长的延迟 t = time_module.strptime('2021-02-21 22:25:14', '%Y-%m-%d %H:%M:%S') t = time_modu

我刚开始学习python,在过去的两天里,我一直在寻找答案。我想添加代码,使其能够暂停脚本(而不是结束脚本),然后在准确的时间运行下面的几行。例如,如果我想让它暂停到晚上10:40,我需要它精确到毫秒。示例:2021 2 21 22 40 00 年月日时分秒毫秒

我得到的最接近它的代码没有准确地执行它,大多数时间都有一秒或更长的延迟

t = time_module.strptime('2021-02-21 22:25:14', '%Y-%m-%d %H:%M:%S')
t = time_module.mktime(t)
scheduler_e = scheduler.enterabs(t, 1, myfunc, ())
scheduler.run()
您可以使用该模块执行以下操作:

导入时间
def在指定时间呼叫(乐趣,t):
sleep\u time=t-time.time()
断言睡眠时间>0#确保t在未来
时间。睡眠(睡眠时间)
乐趣
使用此函数如下所示:

...
1614072496.454525
1614072496.454525
1614072496.454525
1614072496.4555244
1614072496.4555244
1614072496.4595287
1614072496.4595287
1614072496.4595287
1614072496.4595287
1614072496.4595287
1614072496.4595287
1614072496.4595287
1614072496.4605293
1614072496.4605293
1614072496.4605293
...
t=time.strtime(“2021-02-22 23:50:30,%Y-%m-%d%H:%m:%S”)
t=time.mktime(t)
打印(f“排定在{t}”)
在时间调用(lambda:print(f“hello at{time.time()}”),t)
那么这有多准确呢?这里有一个小小的实验来找出答案。如果希望得到更可靠的结果,请使用更大的
n

n=20
结果=[]
对于范围内的u(n):
t=time.time()+未来2秒
在_时间调用_(lambda:results.append(abs(time.time()-t)),t)
打印(f“min={min(结果):5.4f},max={max(结果):5.4f},mean={sum(结果)/n:5.4f}”)
在我的Windows box上,这为我提供了:

min=0.0010, max=0.0200, mean=0.0094
因此,我们的平均距离约为9毫秒,但有时我们的距离高达20毫秒。这种不准确性来自两个方面

  • 不会给你完美的保证(它可能会睡得更短或更长)
  • time.time()不一定具有很高的准确性,这取决于您的系统。例如,请参见讨论
  • 为了说明time.time()的(in-)准确性,您可以在循环中运行它并打印结果数字

    为True时:
    打印(time.time())
    
    在我的Windows计算机上,这给了我如下信息:

    ...
    1614072496.454525
    1614072496.454525
    1614072496.454525
    1614072496.4555244
    1614072496.4555244
    1614072496.4595287
    1614072496.4595287
    1614072496.4595287
    1614072496.4595287
    1614072496.4595287
    1614072496.4595287
    1614072496.4595287
    1614072496.4605293
    1614072496.4605293
    1614072496.4605293
    ...
    
    正如您所见,time.time()可能非常不稳定,这当然限制了您实现所需任务的准确度(以及我上面的实验结果的准确度…)


    如果您所使用的系统中time.time()提供了更好的准确性,或者您找到了另一种获得更好系统时间的方法,那么将睡眠与繁忙的等待相结合可能会获得更好的结果。这样,你至少可以消除时间给你带来的不准确

    def call\u在\u时间\u高精度(乐趣、t、忙碌\u等待\u时间=1):
    sleep\u time=t-time.time()
    断言睡眠时间>0#确保时间在未来
    如果睡眠时间>忙碌等待时间:
    时间。睡眠(睡眠时间-忙碌时间-等待时间)
    while t>time.time():#忙,等待事件发生
    通过
    乐趣
    
    这是否回答了您的问题?