返回信息流我想每隔1分钟执行某个函数如何做?
像Java中的timer.schedule(task, delay, period)类似的功能
sched.scheduler 和 threading.Timer 貌似都只能执行一次
网上找了2个变通的方法
def run_periodically(start, end, interval, func):
event_time = start
while event_time < end:
s.enterabs(event_time, 0, func, ())
event_time += interval
s.run()
这种方法类似于生成了一个任务队列,队列长度是有限的,无法无限循环
比较蠢的一种办法就是在函数末尾继续调用timmer.start()
但是这样的话,当执行的函数时间比较长(比如联网),就没办法保证两次任务启动的间隔是固定值了
def timer_start():
t = threading.Timer(5,test_func)
t.start()
def test_func():
print ("Hello World")
timer_start()
请问各位大神应该怎么做。。
~~更新~~
经过暖神给的链接的提示,看了一下Java中Timer的源码,最后这么实现了,,
def task(func, interval, delay):
start = time()
if delay != 0:
sleep(delay)
func()
end = time()
if start + interval > end:
Timer(start + interval - end, task, (func, interval, 0)).start()
else:
times = round(end - start / interval) # times >= 1
Timer(start + (times + 1) * interval - end, task, (func, interval, 0)).start()
def scheduler(func, interval, delay=0):
Timer(interval, task, (func, interval, delay)).start()
if __name__ == '__main__':
def say_hello():
sleep(0.7)
print(str(time()) + ' : hello')
scheduler(say_hello, 1, 0)
经测试,两次任务之间的延时在10毫秒级别,基本能接受了。。。
这是一条镜像帖。来源:北邮人论坛 / python / #7015同步于 2015/5/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[已解决]请问Python如何定时循环执行任务
dss886
2015/5/22镜像同步27 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
import time
from threading import Timer
import random
def do_something(a,b):
time.sleep(random.randint(a,b))
print('finished')
def run_periodically(start, end, interval, func):
event_time = start
#先调用一次函数
Timer(1,func, args=[0,1]).start()
while event_time < end:
# 随机生成函数参数
rnd = random.randint(1,3)
args = [rnd,rnd+1]
# interval 是延迟时间,func 是呗执行函数,args是函数参数
Timer(interval,func,args).start()
event_time += interval
time.sleep(interval)
run_periodically(0,100,2,do_something)
# 主要思想就是把函数真正执行拿到另一个线程去,这样就不会影响主线程计时了
这个还不错!我试试!
【 在 golifang123 的大作中提到: 】
: import time
: from threading import Timer
: import random
: ...................
google了一下: http://stackoverflow.com/questions/2398661/schedule-a-repeating-event-in-python-3
这样不行啊。。。
比如我设定1分钟启动一次,如果某次任务的运行时间超过1分钟了,就会导致两个同时运行。。。。
【 在 golifang123 的大作中提到: 】
: import time
: from threading import Timer
: import random
: ...................