여러주기 타이머를 만드는 표준 파이썬 모듈이 있습니까? 하나의 스레드에서 실행되는 다른 주기성의 여러주기 타이머를 만드는 것을 지원하는 시스템을 설계하고 싶습니다. 시스템은 언제든지 특정 타이머를 취소 할 수 있어야합니다.여러주기 타이머
미리 감사드립니다. 당신이 1 개 스레드와 붙어있는 경우
여러주기 타이머를 만드는 표준 파이썬 모듈이 있습니까? 하나의 스레드에서 실행되는 다른 주기성의 여러주기 타이머를 만드는 것을 지원하는 시스템을 설계하고 싶습니다. 시스템은 언제든지 특정 타이머를 취소 할 수 있어야합니다.여러주기 타이머
미리 감사드립니다. 당신이 1 개 스레드와 붙어있는 경우
는 - 주파수와 함께 작업 목록을 유지 그들은 실행해야하고 어떤 함수가 호출해야합니다
import time
def example1():
print 'Example'
class Task(object):
def __init__(self, func, delay, args=()):
self.args = args
self.function = func
self.delay = delay
self.next_run = time.time() + self.delay
def shouldRun(self):
return time.time() >= self.next_run
def run(self):
self.function(*(self.args))
self.next_run += self.delay
# self.next_run = time.time() + self.delay
tasks = [Task(example1, 1)] # Run example1 every second
while True:
for t in tasks:
if t.shouldRun():
t.run()
time.sleep(0.01)
또는 당신은 스택리스를 보라 할 수 있습니다 - 당신이하고 싶은 일에 이상적이며, 위의 스케줄러보다 훨씬 정교한 작업 전환을 가능하게합니다.
sched 모듈은 파이썬의 표준 라이브러리에서 확인하십시오 - 본질적으로주기 타이머, 일회성 "이벤트"만 직접적으로 지원하지는 않지만 일회성 이벤트를주기 타이머로 바꾸는 표준 트릭 적용됩니다 (일회성 이벤트를 처리 할 수있는 호출 가능 이벤트는 실제 작업을 수행하기 전에 다음 반복을 위해 자체적으로 다시 스케줄됩니다).
핵심 아이디어 캡슐화하기 위해 "예정된 정기 타이머"클래스를 정의하는 것이 편리 할 수 있습니다
class spt(object):
def __init__(self, scheduler, period):
self._sched = scheduler
self._period = period
self._event = None
def start(self):
self._event = self._sched.enter(0, 0, self._action,())
def _action(self):
self._event - self._sched.enter(self._period, 0, self._action,())
self.act()
def act(self):
print "hi there"
def cancel(self):
self._sched.cancel(self._event)
예약 된주기적인 타이머, 서브 클래스 SPT에 의미있는 조치를 연결하고 act
메소드를 오버라이드 (override)하기를 (A 템플릿 방법 디자인 패턴). 물론 __init__
이 호출 가능한 인수를 취하는 것과 같이 스케줄러 (인스턴스 self.scheduler
)와 마침표 (시간과 함께 표준 방식으로 스케줄러를 인스턴스화하는 경우 초 단위의 부동 소수점 형)를 취하는 것과 같이 더 유연한 아키텍처를 선택할 수 있습니다 .time 및 time.sleep); 선택적으로 위에 사용하는 상수 0 우선 순위를 사용하는 대신 우선 순위를 설정할 수도 있습니다 (어쩌면 기본값 인 값 0).
Alex Martelli가 지적한 sched 모듈을 사용할 수있을 때 NIH처럼 보입니다. – ddaa
이 접근법은 마이크로 컨트롤러에서 종종 볼 수 있습니다. 다중 프로세스 컴퓨팅에서 다른 프로세스에 대한 불이익에 대해 걱정할 필요가 없을 때 (약간의 비용이 들기 때문에) 약간 비쌉니다. –