2009-07-31 4 views
3

여러주기 타이머를 만드는 표준 파이썬 모듈이 있습니까? 하나의 스레드에서 실행되는 다른 주기성의 여러주기 타이머를 만드는 것을 지원하는 시스템을 설계하고 싶습니다. 시스템은 언제든지 특정 타이머를 취소 할 수 있어야합니다.여러주기 타이머

미리 감사드립니다. 당신이 1 개 스레드와 붙어있는 경우

답변

2

는 - 주파수와 함께 작업 목록을 유지 그들은 실행해야하고 어떤 함수가 호출해야합니다

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) 

또는 당신은 스택리스를 보라 할 수 있습니다 - 당신이하고 싶은 일에 이상적이며, 위의 스케줄러보다 훨씬 정교한 작업 전환을 가능하게합니다.

+0

Alex Martelli가 지적한 sched 모듈을 사용할 수있을 때 NIH처럼 보입니다. – ddaa

+0

이 접근법은 마이크로 컨트롤러에서 종종 볼 수 있습니다. 다중 프로세스 컴퓨팅에서 다른 프로세스에 대한 불이익에 대해 걱정할 필요가 없을 때 (약간의 비용이 들기 때문에) 약간 비쌉니다. –

6

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).