Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一秒钟内打印40条消息。印刷品必须在一秒钟内均匀分布_Python_Python 3.x - Fatal编程技术网

Python 在一秒钟内打印40条消息。印刷品必须在一秒钟内均匀分布

Python 在一秒钟内打印40条消息。印刷品必须在一秒钟内均匀分布,python,python-3.x,Python,Python 3.x,下面的代码每秒打印40次“Hello”。我希望这40张照片在一秒钟内均匀分布。就目前的情况来看,40次打印发生在最初的几毫秒内,其余时间程序都处于休眠状态 import time start = time.time() count =0 while True: print("Hello") end = time.time() count +=1 if (end - start) <= 1 and count == 40: sleep_ti

下面的代码每秒打印40次“Hello”。我希望这40张照片在一秒钟内均匀分布。就目前的情况来看,40次打印发生在最初的几毫秒内,其余时间程序都处于休眠状态

import time

start = time.time()
count =0

while True:
    print("Hello")
    end = time.time()
    count +=1
    if (end - start) <= 1 and count == 40:
        sleep_time = 1 - (end - start)
        time.sleep(sleep_time)
        count = 0
        end = 0
        start = time.time()

导入时间
开始=时间。时间()
计数=0
尽管如此:
打印(“你好”)
end=time.time()
计数+=1

if(end-start)包含
sleep
调用的
if
语句在
count
达到40之前不会运行,这显然不是您想要的。显然,应该始终调用
sleep
。通过将睡眠间隔设置为剩余打印和时间的函数,您可以设置一个自调整计时器:

duration = 1.0
target = 40

start = time.time()
while True:
    print("Hello")
    target -= 1
    if target:
        time.sleep((duration + start - time.time()) / target)
    else:
        break

是否以所需频率更新睡眠时间?这里是
1/40
?@AlexandreB。这假设打印本身是即时的,这取决于系统等,可能与事实相去甚远。因此,在您将
打印的内容及时隔开之前,您必须将1次打印的持续时间减去40倍,然后将结果除以39。在高级语言中,“均匀”是不可能的。你在时间上总是会有纳秒到微秒(甚至是微秒)的发散。还有谁会错过一个
睡眠时间,直到
能够考虑到计算时间吗?@adrio。这需要轮询,这会增加交换时间。不,它只是根据目标日期计算睡眠时间。这意味着,如果您的任务持续时间是可变的,那么您仍将执行定期任务。假设您希望每秒(T=1s)运行一个任务,该任务需要10到500毫秒。在睡眠状态下,在T=0时,您运行第一个任务,需要T_1(10-500毫秒),然后睡眠一秒钟。所以第二个任务从t=1+t_1开始,需要t_2(10-500毫秒),然后你再睡一秒钟。任务3从t=2+t_1+t_2开始,任务4从t=3+t_1+t_2+t_3开始。。。。如您所见,错误越来越大。
sleep\u until
而是计算开始时间并添加时段T以计算下一个任务的目标时间,执行此任务,获取新时间并将剩余持续时间休眠到下一个任务。这样,他们总是从t=0,t=1s,t=2s,t=3s开始,除非任务需要的时间超过t,但我们已经说过t=1s,任务需要的时间多达0.5s。这就是RT(实时)系统中周期性任务的完成方式。面向RT的编程语言(显然Python不是其中之一)已经为您提供了
sleep\u until
函数,您不必计算所有这些时间,只需在每个任务中添加1个句点,然后睡眠到该时间。这就是为什么我说我想一直睡到