0

私はスケジューリングアプリケーションを開発していました。スケジュールには、特定の時間にオン/オフする多くのランプがあります。たとえば、朝にスケジュールを開始すると、すべてのランプがオンになり、夜に停止しますが、停止する必要があるランプがいくつかありますランダムな時間、また再びオンにします。APScheduler のような python パッケージをいくつか試しましたが、特定のタスク (またはこの場合はランプ) を停止して再開する機能がありません。

ピクルを使用して停止および再開するこの質問ですが、実装方法がわかりません。これを解決する方法はありますか?

よろしくお願いします。文法が下手で申し訳ありません。

- アップデート -

これは簡単な実装ですが、このコードが正しいかどうかはわかりません。

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 を使用することは悪い解決策ではなく、この例で使用するものです。私がすることは、顧客トリガーを書くことです。

このトリガーは、顧客データベースまたはデータ ストアを使用します。これは、デフォルトのメモリ ストアまたはデータベース ストアから簡単に拡張できます。これには、特定のジョブをスキップするか実行しないかのフラグがあります。したがって、ランプをオン/オフするタスクが発生すると、顧客トリガーがデータベースをチェックして、タスクがオン/オフされているかどうかを確認し、現在の状態に基づいて必要なアクションを実行します。

これは、 Extended APScheduler Documentationを参照することで実行できます。

停止/再開ロジックを組み込むために拡張される間隔トリガー クラス

顧客データストア用に実装する必要があるインターフェース

編集:

あなたの実装にはwhile、内側のループ部分のelseケースを処理せず、スリープしないため、途中でスリープせずにループが無限ループに入るという1つの問題があります。これにより、1 つのランプで CPU 使用率が高くなります。

于 2012-12-19T18:37:23.380 に答える
1

この問題の見方が間違っているのではないかと思います。「ランプオン」を停止して再開するタスクと見なすのは、非常に複雑です。実際には、一連のスケジュールされたステートレス イベントがあります。ランプをオンにし、ランプをオフにします (また、オフの場合はオンに、オンの場合はオフにするトグル ランプ)。システムをそのようにモデル化しようとすると、おそらくスケジューラーをセットアップする方が簡単であることがわかります。

于 2012-12-19T17:17:45.623 に答える