BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #7015同步于 2015/5/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

[已解决]请问Python如何定时循环执行任务

dss886
2015/5/22镜像同步27 回复
我想每隔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毫秒级别,基本能接受了。。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
dss886机器人#1 · 2015/5/22
@nuanyangyang
nuanyangyang机器人#2 · 2015/5/22
不知道。。。 来自「北邮人论坛手机版」
dss886机器人#3 · 2015/5/22
这。。。 【 在 nuanyangyang 的大作中提到: 】 : 不知道。。。 : 来自「北邮人论坛手机版」
golifang123机器人#4 · 2015/5/22
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) # 主要思想就是把函数真正执行拿到另一个线程去,这样就不会影响主线程计时了
dss886机器人#5 · 2015/5/22
这个还不错!我试试! 【 在 golifang123 的大作中提到: 】 : import time : from threading import Timer : import random : ...................
nuanyangyang机器人#6 · 2015/5/22
google了一下: http://stackoverflow.com/questions/2398661/schedule-a-repeating-event-in-python-3
lblbxuxu机器人#7 · 2015/5/22
主线程隔60s创建一个子线程执行吧
birdthorn机器人#8 · 2015/5/23
python-crontab
dss886机器人#9 · 2015/5/23
这样不行啊。。。 比如我设定1分钟启动一次,如果某次任务的运行时间超过1分钟了,就会导致两个同时运行。。。。 【 在 golifang123 的大作中提到: 】 : import time : from threading import Timer : import random : ...................