Python执行和睡眠时间变化

Python执行和睡眠时间变化,python,timing,variations,Python,Timing,Variations,我正在运行一个脚本来收集数据,我注意到时间上有一些奇怪的变化 我有一个通过FTDI库轮询I2C数据的脚本,它以3.5 HZ的频率拉入数据。它很结实,效果很好。这就是(我们称之为poll\u data.py): 在运行了105次之后(实际上它是在一个循环中运行x次,为了便于阅读,这里缩短了),我看到了执行时间的一些奇怪变化。这是一个小样本 Run information Start

我正在运行一个脚本来收集数据,我注意到时间上有一些奇怪的变化

我有一个通过FTDI库轮询I2C数据的脚本,它以3.5 HZ的频率拉入数据。它很结实,效果很好。这就是(我们称之为
poll\u data.py
):

在运行了105次之后(实际上它是在一个循环中运行x次,为了便于阅读,这里缩短了),我看到了执行时间的一些奇怪变化。这是一个小样本

                         Run information                             
     Start      |    Interval     |   Process End   |    Finished      
1402934605.5525 |         59.9994 |         61.5621 |         64.3632  
1402934670.9171 |         59.9991 |         60.5022 |         62.8066  
1402934734.7252 |         59.9995 |         71.3656 |         77.0946  
1402934812.8211 |         59.9996 |         61.4797 |         61.6411  
1402934875.4637 |         59.9995 |         60.7879 |         60.7954  
1402934937.2605 |         59.9995 |         60.2218 |         60.5099  
1402934998.7719 |         59.9995 |         62.2200 |         65.0900  
1402935064.8633 |         59.9994 |         60.0802 |         60.4974  
1402935126.3622 |         59.9994 |         61.5364 |         63.3869  
1402935190.7505 |         59.9995 |         61.5147 |         61.9220  



Average Interval 59.99951714    Max 59.9998     Min 59.9991
                 62.28667048        71.3757         60.0485
                 64.23963714        77.0946         60.2074
我很好奇为什么睡眠间隔似乎总是一样的,但停止时间却不同,完成时间也不同。该过程在项目放入队列后立即结束,但这似乎需要一段时间

这是怎么回事


编辑:在适当的位置添加了process.start()。

这可能不是一个令人满意的答案,但我认为这只是基于操作系统调度,因为您显示的代码看起来不会导致任何其他延迟。这里有几个重要因素。您正在使用
sleep
功能,该功能本身表示可能需要更少或更多的时间,具体取决于:

您使用的线程在Python中由于GIL而不能并发运行。最后,当您运行这些测试时,运行这些测试的计算机在做什么?也许python进程没有得到应有的调度。我之前的评论有点错误,因为间隔显示线程创建时间是非常恒定的。如果您没有显示所有涉及的代码,可能还有其他因素(例如,文件读取/写入导致IO等待)

也许可以尝试一下快速的健康检查:

import time
start = time.time()
time.sleep(60)
stop = time.time()
print stop - start
编辑


要再次从我的评论中调出
join
,如果使用
join
,则主线程将在等待线程时被阻止,并且不会运行任何实际代码。通过这种方式,可以为线程提供任何处理时间来捕捉停止信号。

如果使用
process.join()
而不是while循环,时间会发生什么变化?另外,请注意,结束时间和完成时间使用
start\u时间,其中包括创建线程的时间。我猜如果在创建线程后设置
start\u time
,时间可能会变得更稳定一些。什么时候调用process.start()
?还没有尝试process.join(),在生产中启动了几个流程,我只是注意到这个流程有很多不同的结束时间。(其他人可能也会这样做,但他们只是输出累积结果,而不是每秒数个)。谢谢你的回答!我认为在轮询循环中添加time.sleep(0.001)确实有助于出于某种原因缩短时间。我必须做一些测试,看看它是否会改变在这段时间内收集的数据点的数量。
                         Run information                             
     Start      |    Interval     |   Process End   |    Finished      
1402934605.5525 |         59.9994 |         61.5621 |         64.3632  
1402934670.9171 |         59.9991 |         60.5022 |         62.8066  
1402934734.7252 |         59.9995 |         71.3656 |         77.0946  
1402934812.8211 |         59.9996 |         61.4797 |         61.6411  
1402934875.4637 |         59.9995 |         60.7879 |         60.7954  
1402934937.2605 |         59.9995 |         60.2218 |         60.5099  
1402934998.7719 |         59.9995 |         62.2200 |         65.0900  
1402935064.8633 |         59.9994 |         60.0802 |         60.4974  
1402935126.3622 |         59.9994 |         61.5364 |         63.3869  
1402935190.7505 |         59.9995 |         61.5147 |         61.9220  



Average Interval 59.99951714    Max 59.9998     Min 59.9991
                 62.28667048        71.3757         60.0485
                 64.23963714        77.0946         60.2074
import time
start = time.time()
time.sleep(60)
stop = time.time()
print stop - start