3

私は次のようにラズベリーパイ(庭を制御する)でヘッドレスで実行されている長時間実行されているPythonプロセスを持っています:

from time import sleep

def run_garden():
    while 1:
        /* do work */
        sleep(60)

if __name__ == "__main__":
    run_garden()

60秒の睡眠期間は、私の庭で起こっている変化(湿度、気温、ポンプのオン、ファンのオフなど)に十分な時間ですが、これらを手動でオーバーライドしたい場合はどうすればよいですか?

現在、私の/* do work */ループでは、最初に構成変数を保持している別のサーバーを呼び出し、Webコンソールを介してそれらの構成変数を更新できますが、60秒のループに依存しているため、リアルタイムの感覚が欠けています(たとえば、Webコンソールを更新してから、目的の効果が有効になるまで45秒待つ場合があります)

実行中のraspberryPirun_garden()は庭専用であり、基本的にリソースを消費するのはそれだけです。だから私は何かをする余地があることを知っています、私はただ何を知らないのです。

ループが構成変数が更新されたという事実を検出すると、ループは60秒待つのではなく、指数バックオフを実行して相互作用をチェックし続けることができますが、それがはるかに優れているとは思えません。

基本的にこの長期実行プロセスに飛び込むためのより良い方法はありますか?

4

3 に答える 3

1

一定時間スリープする代わりに、イベントベースのループを使用してみませんか。

そうすれば、ループは変更が検出されたときにのみ実行され、変更が検出されたときに常に実行されます(これが質問のポイントですか?)。

あなたは以下を使用することによってそのようなことをすることができます:
pythonイベントオブジェクト

1つまたはすべてのイベントオブジェクトがトリガーされるのを待って、ループを実行するだけです。1つの変数が頻繁に更新されることを期待するかどうかに応じて、Xイベントが実行されるのを待つこともできます。

または次のようなシステムでさえ: イベントの放送

于 2013-03-24T13:25:49.493 に答える
1

メインループのソケットでリッスンします。ソケット読み取り呼び出しでタイムアウト(たとえば、60秒、次のガーデン更新が実行されるまでの時間)を使用して、コマンドが着信しないときに少なくとも1分ごとに通常の機能に戻るようにします。

庭の手入れの更新を毎分以内に行う必要がある場合は、最後の更新からの時間を確認する必要があります。コマンドが着信すると、読み取り呼び出しが大幅に速く完了するためです

于 2013-03-24T13:34:57.187 に答える
1

Pythonのselectモジュールは役立つかもしれないように思えます。

UNIXアナログを使用したことがある場合(たとえば、ソケットプログラミングで)、おなじみです。

そうでない場合は、ここselectに私がよくお勧めするCソケットリファレンスのセクションがあります。そして、これがモジュールの素晴らしい記事のように見えるものです

警告:最初のリファレンスはPythonではなくCに関するものですが、selectシステムコールの概念は同じであるため、説明が役立つ場合があります。

基本的に、関心のあるイベント(たとえば、ソケットデータの到着、キーボードイベント)を通知でき、永久にブロックするか、指定したタイムアウトが経過するまでブロックします。

ソケットを使用している場合は、関心のあるイベントのリストにソケットとstdinを追加するのは簡単です。キーが押されたことが検出されない限り、または検出されるまで60秒間「条件付きでスリープ」する方法を探している場合は、これも同様に機能します。

編集

これを解決する別の方法は、raspberry-piをWebコンソールを実行しているサーバーに「登録」することです。これには少し余分な作業が必要になる可能性がありますが、探しているリアルタイムの効果が得られます。

基本的に、raspberry-piは、サーバーにそれ自体について警告することによってそれ自体を「登録」し、サーバーはデバイスのアドレスを保存します。TCPを使用している場合は、接続を開いたままにしておくことができます(これは、処理するファイアウォールがある場合に重要になる可能性があります)。UDPを使用している場合は、登録する前にデバイスのポートをバインドして、サーバーが「アナウンス」の送信元アドレスに応答できるようにすることができます。

発表されたら、設定時に。サーバー上でオプションが変更されます。通常、次の2つのいずれかが発生します。

A)設定オプションが変更されたことをデバイスに警告する小さな「ping」(一般的な意味では、ICMPホスト検出プロトコルではありません)を送信します。この時点で、ホストはすぐに完全な構成を要求します。セット、それでアップデートを取得します。

B)更新された構成を送信します。オプション(または構成セット全体)をデバイスに戻します。これにより、デバイスとサーバー間のメッセージの数が減りますが、現在の設定からの逸脱が多いように見えるため、おそらくより多くの作業が必要になります。

于 2013-03-24T13:44:41.590 に答える