2012-12-19 3 views
0

일정에 따라 특정 시간에 켜고 끄는 램프가 많이 있습니다. 예를 들어 아침에 일정을 시작하면 모든 램프가 켜지고 중지됩니다 밤에는하지만 임의의 시간에 멈추고 다시 켜야하는 램프가 있습니다. APScheduler 같은 파이썬 패키지를 사용해 보았지만 특정 작업 (이 경우 램프)을 중지했다가 다시 시작할 수있는 기능이 없습니다.Python - 작업을 중지하고 다시 시작하는 기능으로 스케줄링

question 피클을 사용하여 멈추고 다시 시작하는 방법을 사용하지만이 방법을 구현하는 방법을 모르겠습니다.이를 해결할 방법이 있습니까?

미리 감사드립니다. 나쁜 문구는 유감스럽게 생각합니다. 여기 --UPDATE--

는이 코드를 잘 모르겠어요, 간단한 구현입니다.

from datetime import datetime 
from time import sleep 

class Scheduling: 

    def __init__(self): 
     self.lamp = {} 

    def run(self, lamp_id, start, finish): 
     """Called one-time only for each lamp""" 

     self.lamp[lamp_id] = (start, finish) 

     while True: 
      if datetime.now().strftime('%H:%M:%S') == start: 
       sleep(1) 
       print 'SET LAMP %s ON' % lamp_id 
      elif datetime.now().strftime('%H:%M:%S') == finish: 
       sleep(1) 
       print 'SET LAMP %s OFF' % lamp_id 

    def stop(self, lamp_id): 
     print 'SET lamp %s OFF' % lamp_id 

    def resume(self, lamp_id): 
     print 'SET lamp %s ON' % lamp_id 
     finish = self.lamp[lamp_id][1] 

     while True: 
      if datetime.now().strftime('%H:%M:%S') == finish: 
       print 'SET lamp %s OFF' % lamp_id 

if __name__ == '__main__': 
    schedule = Scheduling() 
    schedule.run(1, '00:00:00', '00:01:00') 

답변

1

나는이 문제를 잘못보고있을 수 있습니다. "램프 점등"을 중지하고 다시 시작할 작업으로 보는 것은 복잡합니다. 정말로, 당신이 가지고있는 것은 일련의 예약 된 상태없는 이벤트입니다; 램프를 켜고, 램프를 끕니다 (램프가 켜지면 켜고 끌 수 있습니다). 그런 식으로 시스템을 모델링하려고하면 아마도 스케쥴러를 설정하는 것이 더 쉬울 것입니다.

+0

맞아요, 간단한 구현을 썼지 만, 내 프로세서를 실행하는이 스크립트가 거의 하나의 램프에 대해 60 %의 사용률을 얻었을 때 이것이 좋지 않다고 생각합니다. – Kyomuu

+0

외부 저장 장치 메커니즘 (DB, csv, yaml 등)을 사용하여 모든 예약 된 이벤트를 기록하고 프로세스가 마지막으로 다른 파일에서 실행 된 기록을 유지 한 다음 마지막 실행 시간 및 구성 파일의 현재 시간 그런 다음 매 15 분마다 또는 매시간마다 프로세스를 실행하도록 OS를 예약 할 수 있습니다. –

0

APScheduler를 사용하는 것은 나쁜 해결책이 아니며이 인스턴스에서 사용할 것입니다. 내가 할 일은 고객 트리거를 작성하는 것입니다.

이 트리거는 기본 메모리 저장소 또는 데이터베이스 저장소에서 확장하기 쉬운 고객 데이터베이스 또는 데이터 저장소를 사용합니다. 특정 작업을 건너 뛰거나 실행하지 않을 것인지 여부를 나타내는 플래그가 있습니다. 이제 램프 켜기/끄기 작업이 시작되면 고객 트리거가 데이터베이스를 검사하여 작업 켜기/끄기를 확인하고 현재 상태에 따라 필요한 작업을 수행합니다.

Extending APScheduler Documentation을 보면이 작업을 수행 할 수 있습니다.

Interval Trigger Class that would be extended to incorporate your stop/resume logic

The Interface you will need to implement for the customer datastore

편집 :

귀하의 구현이 당신이 처리하지 않기 때문에, 중간에 잠을하지 않고, 무한 루프에 들어갈 것이라는 while 루프에서 한 가지 문제 그렇지 않으면 내부 루프 부분에 대한 경우이며 잠을 자지 않습니다. 이로 인해 단일 램프로 높은 CPU 사용량이 발생합니다.

관련 문제