2009-03-06 4 views
0

私はDjangoのフロントエンドを使って、Pythonでバックアップシステムを書いています。私は少し奇妙な方法でスケジューリングを実装することに決めました - クライアントはサーバーを(10分ごとに)ポーリングし、必要なバックアップのリストを探します。サーバーは、バックアップする時間に達すると応答します。これは、システムのプラットフォームを独立させておくためです。つまり、私はcronjobなどに依存しません。したがって、Djangoフロントエンド(XML-RPC APIを公開する)は、データベースにスケジュールを格納し、クライアントがバックアップを開始するかどうかを決定するためにそのスケジュールを解釈する必要があります。Python/Djangoを介して、データベース内のスケジュールを表現する最善の方法は何ですか?

現在、スケジュールは、日、時間、分の3つのフィールドを使用して格納されています。これらはカンマ区切りの整数リストで、曜日(0〜6)、時間(0〜23)、時(0〜59)を表します。クライアントがバックアップを開始するかどうかを決定するには、ひどく非効率的な操作です - Pythonは、過去7日間、それから時間数、そして分数からすべての日にループする必要があります。私はそれがあまりループしないようにいくつかの最適化を行っていますが、それでもなお!

これは比較的うまくいきますが、実装はかなり醜いです。私が持っている問題は、フロントエンドでHTMLフォームを使ってこの情報を表示し解釈する方法です。現在、私はマルチセレクションフィールドの巨大なリストを持っていますが、明らかにうまく機能しません。

誰もが、より効率的で、またHTML形式で表現するのが容易になるスケジュールを実装するための別の方法を提案することはできますか?

+0

少しシナリオを明確にできますか?何がバックアップされていますか - クライアント上のデータですか?次回のバックアップ日をdatetimeとしてデータベースに格納するだけの理由はありませんか? –

+0

バックアップ間隔をタイムデータとして使用しますか?最後のバックアップの時間と必要なtimedeltaを保存した場合、計算は簡単になります。 –

+0

私はなぜこれについて考えなかったのか分かりません。私はcronのような構文のために行くつもりだった - そして、その道に完全に立ち往生した。計画は今、次の実行日時をユーザに尋ね、それをデルタとともに記憶することである。私は素敵なJQuery UIのdatepickerウィジェットを使用することができます:)。 助けてくれてありがとう! –

答えて

3

django-chronographをご覧ください。それはあらゆる種類の間隔でジョブをスケジューリングするためのかなり良いインターフェースを持っています。あなたはそれからいくつかのアイデアを借りることができるかもしれません。これは、python-dateutilに依存しています。繰り返しイベントを指定すると便利です。

+0

+1 django-chronographの場合、dateutilを使用して豊富な時間指定言語を提供します。 –

+0

dateutilは本当に強力に見えますが、依存関係を保つためにこのプロジェクトに使用するとは思いません。上記の方法では、私は少しの数学より複雑なものは必要ありません! –

0

あなたの質問はあなたが意味ビット曖昧-行うです:「戻るまで毎週日曜日、月曜日と金曜日の時間X.で」

もしそうなら、整数として定期的なスケジュールを保存するためにBitmaskを使用します。

はのが上記の日曜日、月曜日と金曜日に述べたようにバックアップをしたいとしましょう。 (バイナリで表される)整数として曜日をエンコード:

>>> 0b1100010 & 0b0000010 != 0 
True 

S M T W T F S 
1 1 0 0 0 1 0 = 98 

今日かどうかを確認するには、(。例えば金曜日)バックアップの日で、単にビット単位andを行います整数として現在の日付を取得するには、weekday()以来1で、それを相殺する必要がある週は月曜日に始まり前提としています。要するに

current_day = (timezone.now().weekday() + 1) % 7 

、あなたののスキーマを10オブジェクトのようなものになります。このスキーマで

class Schedule(models.Model): 
    days_recurrence = models.PositiveSmallIntegerField(db_index=True) 
    time = models.TimeField() 

を、あなたがバックアップしたい日のたびに、新しいScheduleオブジェクトが必要になります。これは、2サイクルの周りのビット演算コスト以来、高速検索であり、あなたがフィールドdays_recurrenceをインデックスしているので、あなたはかなりあなたの複雑さを削減する必要がありO(logn)の最悪の場合の日のルックアップを持っています。あなたはこのうちの多くのパフォーマンスを圧迫したい場合は、その後、分を保存時間のためのビットマスクを使用することができます。

+0

これは非常に洗練されたソリューションです。 – user2660171

関連する問題