准确的时间睡在python

我需要在我的一个function中等待大约25ms。 有时这个函数在处理器被其他事物占用时被调用,而其他时候则被称为处理器自身。

我试过time.sleep(.25)但有时它实际上是25ms,其他时间需要更长的时间。 无论处理器是否可用,是否有一种方法可以准确地睡眠一段时间?

因为您正在使用抢先式操作系统,所以您无法保证您的进程能够在25ms内控制CPU。

如果你仍然想尝试,最好有一个忙碌的循环轮询,直到25ms过去。 像这样的东西可能会工作:

 import time target_time = time.clock() + 0.025 while time.clock() < target_time: pass 

0.25秒是250毫秒,而不是25秒。除此之外,在普通操作系统上无法精确等待25毫秒 – 您需要一些实时操作系统。

你在什么系统上? 如果你在Windows上,你可能想要做这样的事情:

 import ctypes kernel32 = ctypes.windll.kernel32 # This sets the priority of the process to realtime--the same priority as the mouse pointer. kernel32.SetThreadPriority(kernel32.GetCurrentThread(), 31) # This creates a timer. This only needs to be done once. timer = kernel32.CreateWaitableTimerA(ctypes.c_void_p(), True, ctypes.c_void_p()) # The kernel measures in 100 nanosecond intervals, so we must multiply .25 by 10000 delay = ctypes.c_longlong(.25 * 10000) kernel32.SetWaitableTimer(timer, ctypes.byref(delay), 0, ctypes.c_void_p(), ctypes.c_void_p(), False) kernel32.WaitForSingleObject(timer, 0xffffffff) 

这个代码几乎可以保证你的进程会睡25秒。 注意,虽然你可能想降低优先级为2或3,除非这是绝对重要的 ,这个睡了0.25秒。 当然,不要把用户端产品的优先级过高。

你打算做的是一个实时的应用程序。 Python(也可能是您使用的操作系统)并不打算编程这种时间限制如此严格的应用程序。

为了达到目标,您需要一个RTOS(实时操作系统),并使用合适的编程语言(通常是C)按照RT最佳实践开发您的应用程序。

从睡眠方法的文档 :

暂停执行给定的秒数。 该参数可能是一个浮点数,以表示更准确的睡眠时间。 实际的中止时间可能会少于所要求的时间,因为任何捕捉到的信号都会在执行该信号的捕捉程序之后终止睡眠()。 而且,由于系统中的其他活动的调度,中止时间可能比任意量所要求的更长

事实是,这取决于你的底层操作系统。

编辑:在Windows 10中,这个废话似乎是不必要的。 像这样尝试:

 >>> from time import sleep >>> import timeit >>> '%.2f%% overhead' % (timeit.timeit('sleep(0.025)', number=100, globals=globals()) / 0.025 - 100) '0.29% overhead' 

.29%左右,开销相当低,通常还不够准确。

以前的Windows版本将默认具有55毫秒的睡眠分辨率,这意味着您的睡眠呼叫将需要25到55毫秒之间的某个地方。 要使睡眠分辨率降至1毫秒,您需要通过调用timeBeginPeriod来设置Windows使用的分辨率:

 import ctypes winmm = ctypes.WinDLL('winmm') winmm.timeBeginPeriod(1)