我有一个函数,我想在每一分钟触发一次 - 在00秒。它通过空中发射一个数据包到一个笨拙的显示器上,该显示器将安装在墙上。准确触发Python函数
我知道我可以用一段时间的蛮力强迫它,但这似乎有点苛刻。
我曾尝试使用sched,但最终每分钟添加第二个。
我有什么选择?
我有一个函数,我想在每一分钟触发一次 - 在00秒。它通过空中发射一个数据包到一个笨拙的显示器上,该显示器将安装在墙上。准确触发Python函数
我知道我可以用一段时间的蛮力强迫它,但这似乎有点苛刻。
我曾尝试使用sched,但最终每分钟添加第二个。
我有什么选择?
您可以试试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
。
,你可以使用while循环和睡眠不吃起来处理器太多
最简单的解决办法是将注册超时与操作系统到期之时,你想让它。
现在有很多方法可以用阻塞指令来做,最好的选择取决于你的实现。最简单的方法是使用time.sleep()
:你把
import time
current_time = time.time()
time_to_sleep = 60 - (current_time % 60)
time.sleep(time_to_sleep)
这样,当前的时间和计算你需要睡觉(秒)的时间。准确度不是毫秒,但足够接近。
即使操作系统/计算机睡眠,time.sleep是否还能工作? – theonlygusti
@theonlygusti我怀疑......当计算机睡眠没有应用程序可以获得CPU时间,因为CPU也睡着了。 有些HW中断可能会唤醒计算机,通常是连接到笔记本电脑显示器的机制,并检测到计算机已打开,许多网卡可通过IPMI接口接收数据包/访问来发出此类中断。 但是,time.sleep函数会请求操作系统暂停执行一段时间。它不会对整个机器发出唤醒呼叫。 – immortal
Python时间模块通常用于这类事件。它有一个名为sleep(t)
的方法,其中t
等于您想要延迟的秒数。
结合了while
循环,你可以让你在找什么:
import time
while condition:
time.sleep(60)
f(x)
这并不代表f(x)需要的时间,所以它会有一个类似的“每分钟增加一秒钟”的问题,这是海报想要避免的。 – tdelaney
,如果你测量过了多长时间你的代码来执行,并扣除该从什么60睡眠时间?
import time
while True:
timeBegin = time.time()
CODE(.....)
timeEnd = time.time()
timeElapsed = timeEnd - timeBegin
time.sleep(60-timeElapsed)
60-timeElapsed有可能是负面的,这会引发IOError。 time.sleep(max(0,60-timeElapsed))可以解决这个问题。 – Jordan
您可以尝试Threading.Timer
查看此示例
from threading import Timer
def job_function():
Timer(60, job_function).start()
print("Running job_funtion")
这将打印的 “运行工作职务” 每分钟
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)
似乎是个不错的工作为一个crontab。 –
@yuvi一个while循环会吃掉一个处理器。 –
@CodyPiersall取决于我不得不说的项目的大小 – yuvi