如何在Python中在特定时间运行特定函数?

如何在Python中在特定时间运行特定函数?,python,real-time,Python,Real Time,例如,我有一个函数do_something(),我希望它能精确运行1秒(而不是.923秒。它不行。但是0.999是可以接受的。) 但是,非常重要的是,do\u something必须精确运行1秒。我正在考虑使用UNIX时间戳并计算秒数。但我真的很想知道Python是否有一种更美观的方法来实现这一点 函数do_something()是长时间运行的,必须在一秒钟后中断。Python的“sched”模块似乎适合: 除此之外:Python不是实时语言,通常也不会在实时操作系统上运行。所以您的需求有点可

例如,我有一个函数do_something(),我希望它能精确运行1秒(而不是.923秒。它不行。但是0.999是可以接受的。)

但是,非常重要的是,
do\u something
必须精确运行1秒。我正在考虑使用UNIX时间戳并计算秒数。但我真的很想知道Python是否有一种更美观的方法来实现这一点


函数
do_something()
是长时间运行的,必须在一秒钟后中断。

Python的“sched”模块似乎适合:


除此之外:Python不是实时语言,通常也不会在实时操作系统上运行。所以您的需求有点可疑。

这段代码可能适合您。描述听起来像您想要的:

它依赖于python
信号
模块:


我从评论中得知,这里某处有一个
while
循环。下面是一个类,它根据
线程
模块中
\u Timer
的源代码对
线程
进行子类化。我知道你说过你决定不使用线程,但这只是一个定时器控制线程<代码>执行某些操作在主线程中执行。所以这应该是干净的。(如果我错了,有人纠正我!):

你可以这样使用它

import time

def do_something():
    running = BoolTimer(1.0)
    running.start()
    while running:
        print "running"              # Do something more useful here.
        time.sleep(0.05)             # Do it more or less often.
        if not running:              # If you want to interrupt the loop, 
            print "broke!"           # add breakpoints.
            break                    # You could even put this in a
        time.sleep(0.05)             # try, finally block.

do_something()

它会不会总是用不到一秒钟的时间,而你需要填充它?你是否会花费超过一秒钟的时间来减少它?请澄清你的问题。你想(a)运行
dou something
一次,持续1秒,然后中断它,还是(b)重复运行
dou something
直到1秒过去,或者(c)是否要重复运行
do\u something
,直到1秒过去,并在1秒过去时中断最近的执行?否do\u something()函数只执行某些操作。。。然而,它必须只在一秒钟内做它正在做的事情。如果是1秒,它必须切断它正在做的事情。@JohnRoach:那么选项(a)是什么呢?@JohnRoach:我已经从你的问题中删除了
while
循环,因为我认为它让人们认为你在追求选项(b)或(c)。“Python不是实时语言”我知道我知道。。。当一种语言被强迫灌输给我时,我会说它。这真的不是我的选择。我查一下时间表。看起来很有希望。所以你是说基本上我应该简单地为每个步骤安排我的函数?实际上,
signals
模块不仅仅是unix,而是
SIGALRM
信号。但是,如果您在unix上,这将是一个完美的解决方案。特别是如果您无法控制
do\u something
的内容。不幸的是,该网站的链接现在已断开-已被域名劫持服务捕获:(
import time

def do_something():
    running = BoolTimer(1.0)
    running.start()
    while running:
        print "running"              # Do something more useful here.
        time.sleep(0.05)             # Do it more or less often.
        if not running:              # If you want to interrupt the loop, 
            print "broke!"           # add breakpoints.
            break                    # You could even put this in a
        time.sleep(0.05)             # try, finally block.

do_something()