毫秒精确python定时器

毫秒精确python定时器,python,timer,Python,Timer,我在一个python脚本上工作,该脚本设计用于同时控制多个执行器。为了简化,假设我需要控制两个电机 使用多处理模块,我为每个电机创建一个过程,并将数据保存在一张表上 脚本的这一部分工作正常,但是我需要在精确的时间控制我的马达,每毫秒一次,time()或time.clock()函数似乎不可靠(触发时间在0.05到30毫秒之间!) 这些函数如此不稳定是“正常”的,还是由脚本的另一部分引起的 编辑:我使用了datetime函数(见下文)来提高精度,但仍然存在一些离散级别的错误。例如,如果我想要1ms,

我在一个python脚本上工作,该脚本设计用于同时控制多个执行器。为了简化,假设我需要控制两个电机

使用多处理模块,我为每个电机创建一个过程,并将数据保存在一张表上

脚本的这一部分工作正常,但是我需要在精确的时间控制我的马达,每毫秒一次,time()或time.clock()函数似乎不可靠(触发时间在0.05到30毫秒之间!)

这些函数如此不稳定是“正常”的,还是由脚本的另一部分引起的

编辑:我使用了datetime函数(见下文)来提高精度,但仍然存在一些离散级别的错误。例如,如果我想要1ms,我也得到1.25,0.75,1.5。。。
因此,在我看来,这是由于计算机硬件(正如Serge Ballesta所说)。

我还不能给你一个评论(声誉),所以给你一个答案: 这只是一个线索: 尝试使用cProfile模块

它允许您检查脚本的执行时间,以及脚本中的每个函数。cProfile模块中的Function.run()返回有关脚本的精确统计信息。
也许它可以帮助您..

我想问题不在您的脚本中,而更可能在您的机器中。我假设您使用的是Linux或Windows下的标准计算机。即使计算机能够在一毫秒内完成许多事情,它也会不断地执行以下操作:

  • 网络
  • 鼠标或键盘事件
  • 屏幕(包括屏幕保护程序…)
  • 防病毒软件(主要在Windows上)
  • 系统或守护进程(并且有很多)
  • 多任务管理
如果没有专用的硬件设备,您无法可靠地希望获得1毫秒的精度,或者您必须使用实时系统

编辑:

作为补充,这里引用了Ulrich Eckhardt对另一篇文章的回答:

您有执行串行IO的代码,这将阻止您的进程并可能调用调度程序。如果发生这种情况,它将首先将控制权交给另一个流程,并且只有当该流程产生或超过其时间片时,它才会重新安排您的流程

您的问题是:您正在运行的系统的调度程序时间片的大小是多少?我相信这会让你了解正在发生的事情

由于我“仅”需要一个相对时间(每个命令之间的间隔为1ms),您是否 知道一种精确的方法吗

您所能期望的最好结果是
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

这就是我害怕的。。。由于我“只”需要一个相对的时间(每个命令之间的时间间隔为1ms),您知道一种精确的方法吗?您这样做的能力将高度依赖于您的硬件和操作系统。如果
time.clock
不能提供您所需的精度,那么唯一真正的建议是尝试不同的硬件。分辨率/精度与精度不一样。谢谢,它确实会稍微提高精度,因为现在的色散在0.5到8毫秒之间。