0

我正在开发一个日程安排应用程序,日程表中有很多灯在特定时间打开和关闭,比如说如果我早上开始日程表,所有灯都会打开然后在晚上停止,但是有一些灯需要停止随机时间并再次打开。我尝试了一些 python 包,如 APScheduler,但它没有停止和恢复特定任务(或在这种情况下为灯)的功能。

这个问题使用pickle停止和恢复,但我不知道如何实现它,有什么办法可以解决这个问题?

提前谢谢,对不起我的语法不好。

- 更新 -

这是简单的实现,我不确定这段代码是否正确。

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')
4

2 回答 2

1

使用 APScheduler 不是一个糟糕的解决方案,也是我在这种情况下会使用的解决方案。我要做的是编写一个客户触发器。

此触发器将使用客户数据库或数据存储,它很容易从默认内存存储或数据库存储扩展。这有一个标志是否跳过或不运行特定的作业。因此,现在发生的情况是当打开/关闭灯的任务出现时,客户触发器将检查数据库以查看任务是否打开/关闭并根据其当前状态执行所需的操作。

这可以通过查看扩展 APScheduler 文档来完成。

将扩展以包含您的停止/恢复逻辑的间隔触发器类

您需要为客户数据存储实现的接口

编辑:

您的实现有一个问题,即while循环将进入无限循环,中间没有睡眠,因为您不处理内部循环部分的 else 情况并且不睡眠。这会导致单灯的 CPU 使用率很高。

于 2012-12-19T18:37:23.380 回答
1

我想你可能看错了这个问题。将“灯亮”视为要停止和恢复的任务过于复杂。真的,你所拥有的是一系列预定的无状态事件;打开一盏灯,关闭一盏灯(也可能是切换灯,如果关闭则将其打开,如果打开则关闭)。如果您尝试以这种方式对系统进行建模,那么设置调度程序可能会更容易。

于 2012-12-19T17:17:45.623 回答