python 3 time.sleep()减慢或加速其他程序

时间:2016-11-12 18:59:02

标签: python multithreading python-3.x

您好我对python 3中的time.sleep()函数有疑问。我要做的是定期循环一个值列表,速率为0.001秒/点。它工作正常,0.01或更高的速率。但是在0.001或更小的情况下,打开或关闭其他程序会严重影响费率。 例如,我有一个100点的列表,每点运行0.001秒。然后完成它需要大约100 * 0.001 = 0.1秒。但是,当我运行代码时,它需要更长的时间才能完成。然后我打开谷歌浏览器并打开堆栈溢出或quora网站,然后它以正确的速度运行大约0.11秒。 我想知道是否有任何解决方案来解决这个问题,或者time.sleep()的替代方案不会受到其他程序的影响。以下是我测试time.sleep()的代码。

import time
from timeit import default_timer as timer
import threading

my_points = [1,2,3,4,5,6,7,8,9,10,
            11,12,13,14,15,16,17,18,19,20,
            21,22,23,24,25,26,27,28,29,30,
            31,32,33,34,35,36,37,38,39,40,
            41,42,43,44,45,46,47,48,49,50,
            51,52,53,54,55,56,57,58,59,60,
            61,62,63,64,65,66,67,68,69,70,
            71,72,73,74,75,76,77,78,79,80,
            81,82,83,84,85,86,87,88,89,90,
            91,92,93,94,95,96,97,98,99,100,]

def execute():
   while True:
      start = timer()
      for i in my_points:
         print (i, flush = True)
         time.sleep(0.001) #Problem is here

      end = timer()
      print ("Total time run per cycle: ", end - start)
      time.sleep(2) #To read the time

execute()

2 个答案:

答案 0 :(得分:0)

time.sleep

的手动输入
  

time.sleep(秒)

     

暂停执行调用线程达到给定的秒数。参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获例程后终止sleep()。此外,由于系统中其他活动的安排,暂停时间可能比任意数量的请求时间长。

     

在版本3.5中更改:即使睡眠被信号中断,该函数现在至少休眠秒,除非信号处理程序引发异常(参见PEP 475的基本原理)。

非常清楚,实际的睡眠时间只会接近请求的时间。我已经单独阅读过Windows上的分辨率为1/60秒,但我不知道是否仍然如此。

使用tkinter root.after函数可以做得更好。当我在IDLE中运行以下内容时

import tkinter as tk
from time import perf_counter as timer

root = tk.Tk()
n = 1000
def tick():
    global n
    if n:
        #print(n)
        root.after(1, tick)
        n -= 1
    else:
        print(timer() - start)
        root.quit()

root.after(1, tick)
start = timer()
root.mainloop()

输出重复在1.05秒之内,非常接近目标1.00。如果我取消注释tick print语句,则时间为4.2秒。在IDLE中,打印通过套接字进入单独的进程,这有点慢。在Windows命令提示符下运行,1000打印时间为1.3秒。我希望这是关于你可以输出到连续帖子的内容,只要收件人可以跟上流程。

编辑可以使用相对较新的asyncio模块执行类似操作,并且需要更多努力,甚至可以使用较新的async for语法。但我没有记住所需的知识。

答案 1 :(得分:0)

一般来说,POSIX中的睡眠功能,也可能是Windows,保证至少在指定的时间内休眠(除非早先被信号中断),但是在指定的持续时间后,它们可能会在任意长时间内任意休眠,具体取决于操作系统的时间线程调度程序决定唤醒线程。

您可以尝试使用实时调度策略运行程序,例如:如果您使用Linux,请参阅https://docs.python.org/3/library/os.html#os.sched_setschedulerhttp://man7.org/linux/man-pages/man2/sched_setscheduler.2.html