python定时调度升级
几年前其实有写过python定时调度的简易写法,比较简单直观。但是没有解决time.sleep有时会出现无法被唤醒的情况。time.sleep出现无法被唤醒的原因是在单线程中,资源由于被别的调度任务占用,所以会导致time.sleep任务异常。所以在使用time.sleep时,会建议单独起一个线程资源来执行time.sleep任务。解决方案如下:
import threading import time event = threading.Event() def create_time(): while True: # lock.acquire() time.sleep(3) event.set() # lock.release() def use_data(): while True: # lock.acquire() event.wait() print(time.time()) print(threading.activeCount()) print(threading.current_thread()) event.clear() # lock.release() t = threading.Thread(target=create_time) t1 = threading.Thread(target=use_data) t.start() t1.start()
逻辑中被注释掉的部分,是用线程锁来实现的,同样可以解决调度任务,是没有问题的。在前边的文章中,其实还有提到使用队列来实现调度任务。这套解决方案的本质其实就还是信号方式。一边在计时,另外一边在等待信号,当接收到信号后,开始执行任务。目前从理论上来讲,一直想要替换掉time.sleep,但是又发现,定时任务执行信号的发起,一定是和时间挂钩的,所以可能无法被避免掉,如果看到本文的兄弟有更好的方案,可以私信互相学习一下。