毫秒级精确的Python定时器

7 投票
3 回答
16305 浏览
提问于 2025-04-18 13:22

我正在写一个Python脚本,目的是同时控制多个执行器。简单来说,我需要控制两个电动马达。

我使用了多进程模块,为每个马达创建一个进程,同时还创建一个进程来保存数据到一个表格里。

这部分的脚本运行得很好,不过我需要在非常精确的时间点控制我的马达,每毫秒都要准确。但是,使用time.time()或time.clock()这两个函数时,结果似乎不太可靠(时间差在0.05到30毫秒之间波动!)

这些函数这么不稳定算“正常”吗?还是说是我脚本的其他部分导致的?

补充:我使用了datetime函数(见下文)来提高精度,但我仍然有几个不同的误差级别。例如,如果我想要1毫秒,结果却可能是1.25、0.75、1.5……所以我认为这可能是由于计算机硬件的问题(正如Serge Ballesta所说)。

3 个回答

1

我还不能给你评论(因为声望不够),所以我给你一个答案:这只是一个提示:试试使用 cProfile 模块。

https://docs.python.org/2/library/profile.html

这个模块可以让你查看你的脚本运行了多长时间,以及脚本中的每个函数的执行时间。cProfile 模块中的 .run() 函数会返回关于你的脚本的详细统计信息。也许这对你有帮助……

4

因为我“只”需要一个相对时间(每个命令之间间隔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
2

在我看来,问题不在于你的脚本,而更可能是在你的电脑上。我假设你是在使用一台标准的电脑,运行着Linux或Windows系统。即使这台电脑能在一毫秒内完成很多事情,它也会不断地处理以下内容:

  • 网络
  • 鼠标或键盘的操作
  • 屏幕(包括屏幕保护程序...)
  • 杀毒软件(主要是在Windows上)
  • 系统或后台进程(而且这些进程有很多
  • 多任务管理

如果没有专门的硬件设备,或者不使用实时系统,你是无法可靠地达到一毫秒的精确度的。

补充:

这里有一段来自Ulrich Eckhardt对另一个帖子 Windows上不一致的Python性能的回答中的引用:

你的代码在进行串行输入输出时,会阻塞你的进程,并可能会调用调度程序。如果发生这种情况,系统会先把控制权交给其他进程,只有当那个进程让出控制权或者超出它的时间片时,你的进程才会被重新调度。

你需要考虑的问题是:你所运行的系统的调度时间片大小是多少?我相信这会让你更了解发生了什么。

撰写回答