Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定时器中断线程_Python_Multithreading_Timer_Interrupt - Fatal编程技术网

Python 定时器中断线程

Python 定时器中断线程,python,multithreading,timer,interrupt,Python,Multithreading,Timer,Interrupt,我一直在尝试用python制作一个精确的计时器,或者像操作系统允许的那样精确。但它似乎比我最初想象的要复杂 这就是我希望它的工作方式: from time import sleep from threading import Timer def do_this(): print ("hello, world") t = Timer(4, do_this) t.start() sleep(20) t.cancel() 在20秒内,我每四秒钟执行一次“do_thi

我一直在尝试用python制作一个精确的计时器,或者像操作系统允许的那样精确。但它似乎比我最初想象的要复杂

这就是我希望它的工作方式:

from time import sleep
from threading import Timer

def do_this():
    print ("hello, world")


t = Timer(4, do_this)
t.start()
sleep(20)
t.cancel()
在20秒内,我每四秒钟执行一次“do_this”。但是,“do_this”执行一次,然后脚本在20秒后终止

另一种方法是创建一个带有while循环的线程

import time
import threading
import datetime

shutdown_event = threading.Event()

def dowork():
    while not shutdown_event.is_set():
        print(datetime.datetime.now())
        time.sleep(1.0)

def main():

    t = threading.Thread(target=dowork, args=(), name='worker')
    t.start()

    print("Instance started")

    try:
        while t.isAlive():
            t.join(timeout=1.0)
    except (KeyboardInterrupt, SystemExit):
            shutdown_event.set()
    pass

if __name__ == '__main__':
    main()
这个线程按预期执行,但我得到了一个定时漂移。在这种情况下,必须通过相应地调整睡眠来补偿while循环中执行代码所需的时间

python中是否有一种简单的方法,可以每秒(或任何间隔)执行一次计时器,而不必补偿sleep(n)参数,从而与系统时间相比不会产生漂移

谢谢你的帮助

/Anders

如果
dowork()
的运行时间总是少于您的时间间隔,则您可以在循环中每4秒生成一个新线程:

def dowork():
wlen=random.random()
睡眠(wlen)#模仿做一些工作
打印“在%0.2f秒内完成的工作”%wlen
def main():
而1:
t=线程。线程(目标=dowork)
时间。睡眠(4)
如果
dowork()
可能会运行4秒以上,那么在主循环中,您需要确保在生成新作业之前完成上一个作业


但是,
time.sleep()
本身可能会漂移,因为无法保证线程实际挂起的时间。正确的方法是计算出这项工作需要多长时间,然后在剩余的时间内睡觉。我认为这就是UI和游戏渲染引擎的工作原理,它们必须在固定时间每秒显示固定数量的帧,渲染每个帧可能需要不同的时间完成。

Ok。谢谢我就是这么想的。我将对代码进行一些更改,以补偿线程中代码的执行时间。