2

2つの目的を果たす長時間実行プロセス(Linuxデーモン)を作成したいと思います。

  • RESTWebリクエストに応答します
  • スケジュール可能なジョブを実行します

もともとは、実行を実行して更新を実行し、その後cronした単純なプログラムとして機能していましたが、REST要件が追加され、一部のジョブの頻度を変更したいのですが、他のジョブは変更しません(すべてのジョブの頻度が異なるとしましょう)。

長時間実行されるプロセス、特にリクエストに応答するのではなく、独自に処理を実行するプロセスを作成した経験はありません。

私の基本的な計画は、REST部分を別のスレッド/プロセスで実行することであり、ジョブ部分を別々に実行することを考えました。

パターン、特にpythonが存在するかどうか(私がやりたいことの例を探しましたが、実際には見つかりませんでした)、またはこれらを満たすためにプロジェクトを移行することから始める場所について誰かが提案を持っているかどうか疑問に思っています新しい要件。スケジューリングに触れるプロジェクトをいくつか見ましたが、実際のユーザーエクスペリエンス/提案をここで探しています。何がうまくいく/うまくいかないのですか?

4

5 に答える 5

3
  • RESTサーバーとスケジュールされたジョブに共通点がない場合は、RESTサーバーとジョブの2つの別々の実装を実行し、それらを別々のプロセスとして実行します。

  • 前に述べたように、ジョブのものについては既存のスケジューラーを調べてください。Twistedが代替手段になるかどうかはわかりませんが、このプラットフォームを確認することをお勧めします。

  • OTOH、RESTインターフェースがスケジュールされたジョブと同じ機能を呼び出す場合は、次のように、同じ機能への2つのインターフェースとしてそれらを確認する必要があります。

    • 実際のジョブを、RESTサーバーがフォークして実行できるプログラムとして記述します。
    • ジョブのタイミングを処理する別のスケジューラーを用意します。
    • ジョブを実行する予定の場合は、スケジューラーに対応するREST要求をローカルサーバーに発行させます。このように、スケジューラーはジョブの説明のみを処理しますが、それらがどのように実装されているかについての独自の知識はありません。
  • 長時間実行され、可用性の高いプロセスに、必要なデーモンが稼働していることを確認し、必要に応じて再起動するだけの追加の「スーパーバイザー」プロセスがあることは、一般的な特徴です。

于 2009-07-10T07:45:54.947 に答える
1

1つのオプションは、このリストから軽量のWSGIサーバーを選択することです。

リクエストを処理する長時間実行プロセスの作業を実行させます。(スポーンをお勧めします。)コードは、REST APIと、明確に定義されたWSGIインターフェイスを介した要求の処理、およびジョブのスケジューリングに集中できます。

使用できるスケジューリングライブラリは少なくとも2つありますが、それらについてはよくわかりません。

于 2009-07-10T05:33:28.490 に答える
1

これが私たちがしたことです。

  1. シンプルで純粋なwsgiWebアプリケーションを作成して、REST要求に応答します。

    • 仕事を始める

    • ジョブのステータスを報告する

  2. 組み込みのwsgirefサーバーを拡張して、 selectモジュールを使用して着信要求をチェックします。

    • ソケットでのアクティビティは通常のREST要求であり、wsgirefにこれを処理させます。最終的には、WSGIアプリケーションを呼び出して、ステータスに応答し、リクエストを送信します。

    • タイムアウトとは、次の2つのことを行う必要があることを意味します。

      • 走っているすべての子供たちをチェックして、彼らが終わったかどうかを確認してください。ステータスなどを更新します。

      • crontabのようなスケジュールをチェックして、実行する予定の作業があるかどうかを確認します。これは、このサーバーが維持しているSQLiteデータベースです。

于 2009-07-10T10:16:47.183 に答える
0

私は通常cron、スケジューリングに使用します。RESTに関しては、そこにある多くのWebフレームワークの1つを使用できます。ただし、SimpleHTTPServerを実行するだけで十分です。

cron@rebootを使用してRESTサービスの起動をスケジュールできます

@reboot (cd /path/to/my/app && nohup python myserver.py&)
于 2009-07-10T05:29:23.567 に答える
0

スケジューラの通常のデザインパターンは次のとおりです。

  • スケジュールされたジョブのリストを、次の実行時間(日時値として)でソートして維持します。
  • 目覚めたら、リストの最初のジョブを現在の時刻と比較します。期限または期限が過ぎている場合は、リストから削除して実行します。最初のジョブの期限が切れるまで、この方法でリストを処理し続けてから、(next_job_due_date --current_time);の間スリープ状態になります。
  • ジョブの実行が終了したら、必要に応じてスケジュールを変更します。
  • スケジュールにジョブを追加した後、スケジューラプロセスをウェイクアップします。

状況に応じて微調整します(たとえば、ジョブが終了するのではなく、実行を開始した時点で再度実行するようにジョブを再スケジュールしたい場合があります)。

于 2009-07-10T06:36:49.670 に答える