2013-10-28 38 views
3

我有一个函数,我想在每一分钟触发一次 - 在00秒。它通过空中发射一个数据包到一个笨拙的显示器上,该显示器将安装在墙上。准确触发Python函数

我知道我可以用一段时间的蛮力强迫它,但这似乎有点苛刻。

我曾尝试使用sched,但最终每分钟添加第二个。

我有什么选择?

+6

似乎是个不错的工作为一个crontab。 –

+0

@yuvi一个while循环会吃掉一个处理器。 –

+0

@CodyPiersall取决于我不得不说的项目的大小 – yuvi

回答

6

您可以试试APScheduler,这是一个适用于Python的cron风格的调度程序模块。

从他们的例子:

from apscheduler.scheduler import Scheduler 

# Start the scheduler 
sched = Scheduler() 
sched.start() 

def job_function(): 
    print "Hello World" 

sched.add_cron_job(job_function, second=0) 

将每分钟运行job_function

0

,你可以使用while循环和睡眠不吃起来处理器太多

2

最简单的解决办法是将注册超时与操作系统到期之时,你想让它。

现在有很多方法可以用阻塞指令来做,最好的选择取决于你的实现。最简单的方法是使用time.sleep():你把

import time 

current_time = time.time() 
time_to_sleep = 60 - (current_time % 60) 
time.sleep(time_to_sleep) 

这样,当前的时间和计算你需要睡觉(秒)的时间。准确度不是毫秒,但足够接近。

+0

即使操作系统/计算机睡眠,time.sleep是否还能工作? – theonlygusti

+0

@theonlygusti我怀疑......当计算机睡眠没有应用程序可以获得CPU时间,因为CPU也睡着了。 有些HW中断可能会唤醒计算机,通常是连接到笔记本电脑显示器的机制,并检测到计算机已打开,许多网卡可通过IPMI接口接收数据包/访问来发出此类中断。 但是,time.sleep函数会请求操作系统暂停执行一段时间。它不会对整个机器发出唤醒呼叫。 – immortal

1

Python时间模块通常用于这类事件。它有一个名为sleep(t)的方法,其中t等于您想要延迟的秒数。

结合了while循环,你可以让你在找什么:

import time 

while condition: 
    time.sleep(60) 
    f(x) 
+3

这并不代表f(x)需要的时间,所以它会有一个类似的“每分钟增加一秒钟”的问题,这是海报想要避免的。 – tdelaney

3

,如果你测量过了多长时间你的代码来执行,并扣除该从什么60睡眠时间?

import time 

while True: 
    timeBegin = time.time() 

    CODE(.....) 

    timeEnd = time.time() 
    timeElapsed = timeEnd - timeBegin 
    time.sleep(60-timeElapsed) 
+2

60-timeElapsed有可能是负面的,这会引发IOError。 time.sleep(max(0,60-timeElapsed))可以解决这个问题。 – Jordan

0

您可以尝试Threading.Timer

查看此示例

from threading import Timer 

def job_function(): 
    Timer(60, job_function).start() 
    print("Running job_funtion") 

这将打印的 “运行工作职务” 每分钟

1

APScheduler是正确的做法。但是,自最初的答案以来语法已经发生了变化。

由于APScheduler 3.3.1:

def fn(): 
    print "Hello, world" 

from apscheduler.schedulers.background import BackgroundScheduler 

scheduler = BackgroundScheduler() 
scheduler.start() 
scheduler.add_job(fn, trigger='cron', second=0)