您好我对python 3中的time.sleep()
函数有疑问。我要做的是定期循环一个值列表,速率为0.001秒/点。它工作正常,0.01或更高的速率。但是在0.001或更小的情况下,打开或关闭其他程序会严重影响费率。
例如,我有一个100点的列表,每点运行0.001秒。然后完成它需要大约100 * 0.001 = 0.1秒。但是,当我运行代码时,它需要更长的时间才能完成。然后我打开谷歌浏览器并打开堆栈溢出或quora网站,然后它以正确的速度运行大约0.11秒。
我想知道是否有任何解决方案来解决这个问题,或者time.sleep()
的替代方案不会受到其他程序的影响。以下是我测试time.sleep()
的代码。
import time
from timeit import default_timer as timer
import threading
my_points = [1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,
51,52,53,54,55,56,57,58,59,60,
61,62,63,64,65,66,67,68,69,70,
71,72,73,74,75,76,77,78,79,80,
81,82,83,84,85,86,87,88,89,90,
91,92,93,94,95,96,97,98,99,100,]
def execute():
while True:
start = timer()
for i in my_points:
print (i, flush = True)
time.sleep(0.001) #Problem is here
end = timer()
print ("Total time run per cycle: ", end - start)
time.sleep(2) #To read the time
execute()
答案 0 :(得分:0)
time.sleep(秒)
暂停执行调用线程达到给定的秒数。参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获例程后终止sleep()。此外,由于系统中其他活动的安排,暂停时间可能比任意数量的请求时间长。
在版本3.5中更改:即使睡眠被信号中断,该函数现在至少休眠秒,除非信号处理程序引发异常(参见PEP 475的基本原理)。
非常清楚,实际的睡眠时间只会接近请求的时间。我已经单独阅读过Windows上的分辨率为1/60秒,但我不知道是否仍然如此。
使用tkinter root.after函数可以做得更好。当我在IDLE中运行以下内容时
import tkinter as tk
from time import perf_counter as timer
root = tk.Tk()
n = 1000
def tick():
global n
if n:
#print(n)
root.after(1, tick)
n -= 1
else:
print(timer() - start)
root.quit()
root.after(1, tick)
start = timer()
root.mainloop()
输出重复在1.05秒之内,非常接近目标1.00。如果我取消注释tick print语句,则时间为4.2秒。在IDLE中,打印通过套接字进入单独的进程,这有点慢。在Windows命令提示符下运行,1000打印时间为1.3秒。我希望这是关于你可以输出到连续帖子的内容,只要收件人可以跟上流程。
编辑可以使用相对较新的asyncio
模块执行类似操作,并且需要更多努力,甚至可以使用较新的async for
语法。但我没有记住所需的知识。
答案 1 :(得分:0)
一般来说,POSIX中的睡眠功能,也可能是Windows,保证至少在指定的时间内休眠(除非早先被信号中断),但是在指定的持续时间后,它们可能会在任意长时间内任意休眠,具体取决于操作系统的时间线程调度程序决定唤醒线程。
您可以尝试使用实时调度策略运行程序,例如:如果您使用Linux,请参阅https://docs.python.org/3/library/os.html#os.sched_setscheduler和http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html。