我需要等待约25ms的在我的功能之一。 有时,这种函数被调用时,处理器与其他的东西,其他时间占领它具有所有处理器本身。
我试过time.sleep(.25)
但有时它确实为25ms和其他时候,它需要更长的时间。 是否有不管处理器可用性的时间精确量入睡的方法吗?
我需要等待约25ms的在我的功能之一。 有时,这种函数被调用时,处理器与其他的东西,其他时间占领它具有所有处理器本身。
我试过time.sleep(.25)
但有时它确实为25ms和其他时候,它需要更长的时间。 是否有不管处理器可用性的时间精确量入睡的方法吗?
因为你有工作先发制人的操作系统,也没有办法,你能保证你的过程将能够对CPU的控制在25毫秒。
如果您仍想尝试,这将是最好有一个繁忙的循环,直到投票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)
此代码将几乎机制保障您的过程会睡得0.25秒。 当心though-可能要优先级降低到2或3,除非它是绝对关键的 ,这个休眠0.25秒。 当然,不改变优先级太高的用户端产品。
你打算做的是实时应用。 Python中(也可能是您正在使用的操作系统)并不打算对这种应用中,时间限制是非常严格程序。
为了让你实现你在找什么,你需要一个RTOS(实时操作系统),并制定使用以下RT最佳实践合适的编程语言(通常是C)应用程序。
编辑:在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'
0.29%,或左右,是相当低的开销,并且通常比不够准确了。
以前的Windows版本,默认情况下将具有55毫秒睡眠分辨率,这意味着你的睡眠通话将地方采取25个55毫秒之间。 为了让睡眠分辨率降低到1毫秒,你需要设置由Windows通过调用分辨率timeBeginPeriod
:
import ctypes
winmm = ctypes.WinDLL('winmm')
winmm.timeBeginPeriod(1)
从文档的睡眠方法:
暂停的给定秒数执行。 所述参数可以是一个浮点数来表示更精确的睡眠时间。 实际挂起时间可能少于要求的,因为任何抓到信号将结束休眠()以下是信号的捕获程序的执行。 另外,该悬浮液的时间可以长于因为其他活动的系统中的调度的请求的任意量。
事实是,这取决于您的底层操作系统上。
为准确的定时和延迟的另一个解决方案是使用perf_counter()函数从模块的时间。 在Windows作为time.sleep特别有用的是不以毫秒为单位精确。 见下面的例子,其中功能accurate_delay创造了毫秒的延迟。
import time
def accurate_delay(delay):
''' Function to provide accurate time delay in millisecond
'''
_ = time.perf_counter() + delay/1000
while time.perf_counter() < _:
pass
delay = 10
t_start = time.perf_counter()
print('Wait for {:.0f} ms. Start: {:.5f}'.format(delay, t_start))
accurate_delay(delay)
t_end = time.perf_counter()
print('End time: {:.5f}. Delay is {:.5f} ms'.
format(t_end, 1000*(t_end - t_start)))
sum = 0
ntests = 1000
for _ in range(ntests):
t_start = time.perf_counter()
accurate_delay(delay)
t_end = time.perf_counter()
print('Test completed: {:.2f}%'.format(_/ntests * 100), end='\r', flush=True)
sum = sum + 1000*(t_end - t_start) - delay
print('Average difference in time delay is {:.5f} ms.'.format(sum/ntests))