언제든지 heapq
으로 자신의 스케줄러를 구현할 수 있습니다. 여기 start
에 지연이 상대적 스케줄러의 간단한 예입니다 :
import heapq
import time
def fun(after, s):
print('{} after {} seconds: {}'.format(time.time(), after, s))
class Sched:
def __init__(self):
self.tasks = []
def add_task(self, delay_seconds, priority, callback, args):
task = (delay_seconds, priority, callback, args)
heapq.heappush(self.tasks, task)
def start(self):
self.start_time = time.monotonic()
while self.tasks:
now = time.monotonic()
delta = now - self.start_time
nxt = self.tasks[0][0]
if delta < nxt:
time.sleep(nxt - delta)
else:
_, _, callback, args = heapq.heappop(self.tasks)
callback(*args)
sched = Sched()
sched.add_task(5, 1, fun, (5, 'second'))
sched.add_task(5, 0, fun, (5, 'first'))
sched.add_task(7, 0, fun, (7, 'third'))
print(time.time(), 'start')
sched.start()
print(time.time(), 'end')
출력 : 요청시 작업이 정확하게 실행되지 않습니다
1485623736.9788322 start
1485623741.9809415 after 5 seconds: first
1485623741.9809415 after 5 seconds: second
1485623743.9846892 after 7 seconds: third
1485623743.9846892 end
참고. 이는 sleep
의 제한 사항과 이전 작업을 실행하는 데 걸리는 시간 때문일 수 있습니다.
감사합니다. 이것은 막고있다. 뿐만 아니라 sched입니까? 필자는 항상 파이썬 문서를 다른 어떤 것보다 오해 할 수밖에 없다. –
@ DouglasMyers-Turnbull 두 모드 모두에서 [run()] (https://docs.python.org/3/library/sched.html#sched.scheduler.run) 할 수 있으며 기본값은 차단됩니다. – niemmi