毫秒级精确的Python定时器
我正在写一个Python脚本,目的是同时控制多个执行器。简单来说,我需要控制两个电动马达。
我使用了多进程模块,为每个马达创建一个进程,同时还创建一个进程来保存数据到一个表格里。
这部分的脚本运行得很好,不过我需要在非常精确的时间点控制我的马达,每毫秒都要准确。但是,使用time.time()或time.clock()这两个函数时,结果似乎不太可靠(时间差在0.05到30毫秒之间波动!)
这些函数这么不稳定算“正常”吗?还是说是我脚本的其他部分导致的?
补充:我使用了datetime函数(见下文)来提高精度,但我仍然有几个不同的误差级别。例如,如果我想要1毫秒,结果却可能是1.25、0.75、1.5……所以我认为这可能是由于计算机硬件的问题(正如Serge Ballesta所说)。
3 个回答
我还不能给你评论(因为声望不够),所以我给你一个答案:这只是一个提示:试试使用 cProfile 模块。
https://docs.python.org/2/library/profile.html
这个模块可以让你查看你的脚本运行了多长时间,以及脚本中的每个函数的执行时间。cProfile 模块中的 .run() 函数会返回关于你的脚本的详细统计信息。也许这对你有帮助……
因为我“只”需要一个相对时间(每个命令之间间隔1毫秒),你知道有什么方法可以做到这一点吗?
你能做到的最好方法是使用 datetime.datetime.now()
,这个方法可以提供微秒级的时间精度:
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2014, 7, 15, 14, 31, 1, 521368)
>>> i = datetime.datetime.now()
>>> q = datetime.datetime.now()
>>> (i-q).seconds
86389
>>> (i-q).microseconds
648299
>>> i.microsecond
513160
在我看来,问题不在于你的脚本,而更可能是在你的电脑上。我假设你是在使用一台标准的电脑,运行着Linux或Windows系统。即使这台电脑能在一毫秒内完成很多事情,它也会不断地处理以下内容:
- 网络
- 鼠标或键盘的操作
- 屏幕(包括屏幕保护程序...)
- 杀毒软件(主要是在Windows上)
- 系统或后台进程(而且这些进程有很多)
- 多任务管理
如果没有专门的硬件设备,或者不使用实时系统,你是无法可靠地达到一毫秒的精确度的。
补充:
这里有一段来自Ulrich Eckhardt对另一个帖子 Windows上不一致的Python性能的回答中的引用:
你的代码在进行串行输入输出时,会阻塞你的进程,并可能会调用调度程序。如果发生这种情况,系统会先把控制权交给其他进程,只有当那个进程让出控制权或者超出它的时间片时,你的进程才会被重新调度。
你需要考虑的问题是:你所运行的系统的调度时间片大小是多少?我相信这会让你更了解发生了什么。