일반 Python 인수 전달 구문을 사용하여 crontab을 지정할 수 있습니다. 예를 들어, 아래와 같이 Event 클래스를 정의한다고 가정하십시오.
from datetime import datetime, timedelta
import time
# Some utility classes / functions first
class AllMatch(set):
"""Universal set - match everything"""
def __contains__(self, item): return True
allMatch = AllMatch()
def conv_to_set(obj): # Allow single integer to be provided
if isinstance(obj, (int,long)):
return set([obj]) # Single item
if not isinstance(obj, set):
obj = set(obj)
return obj
# The actual Event class
class Event(object):
def __init__(self, action, min=allMatch, hour=allMatch,
day=allMatch, month=allMatch, dow=allMatch,
args=(), kwargs={}):
self.mins = conv_to_set(min)
self.hours= conv_to_set(hour)
self.days = conv_to_set(day)
self.months = conv_to_set(month)
self.dow = conv_to_set(dow)
self.action = action
self.args = args
self.kwargs = kwargs
def matchtime(self, t):
"""Return True if this event should trigger at the specified datetime"""
return ((t.minute in self.mins) and
(t.hour in self.hours) and
(t.day in self.days) and
(t.month in self.months) and
(t.weekday() in self.dow))
def check(self, t):
if self.matchtime(t):
self.action(*self.args, **self.kwargs)
(참고 : 철저히 테스트되지 않았습니다)
그런 다음 CronTab을 일반적인 파이썬 구문으로 다음과 같이 지정할 수 있습니다.
c = CronTab(
Event(perform_backup, 0, 2, dow=6 ),
Event(purge_temps, 0, range(9,18,2), dow=range(0,5))
)
이렇게하면 파이썬의 인수 역학을 최대한 활용할 수 있습니다 (위치 및 키워드 인수를 혼합하고 주 및 월 이름에 기호 이름을 사용할 수 있음)
CronTab 클래스는 분 단위로 잠자고 각 이벤트에서 check ()를 호출하는 것으로 정의됩니다. (아마도 일광 절약 시간 / 시간대에주의해야 할 미묘한 부분이 있습니다). 빠른 구현은 다음과 같습니다.
class CronTab(object):
def __init__(self, *events):
self.events = events
def run(self):
t=datetime(*datetime.now().timetuple()[:5])
while 1:
for e in self.events:
e.check(t)
t += timedelta(minutes=1)
while datetime.now() < t:
time.sleep((t - datetime.now()).seconds)
주의해야 할 몇 가지 사항 : 파이썬의 주중 / 월은 0으로 색인화되며 (크론과 달리) 해당 범위는 마지막 요소를 제외하므로 "1-5"와 같은 구문은 range (0,5)가됩니다. 즉 [0,1,2, 3,4]. cron 구문을 선호한다면 구문 분석이 너무 어렵지 않아야합니다.