2017-10-29 1 views
1

私は過去30年間に他の言語でプログラミングしてきましたが、Pythonを使い始めました。最初のアプリケーションをシンプルにしたいので、ラズベリーパイでホストされている小さなホームオートメーションプロジェクトを使い始めました。Flask app.runを呼び出してもPythonコードを実行し続けることはできますか?

バルブを制御し、フローセンサーを読み取り、ディスプレイ上にデータを表示するようにコードを作成しましたが、いくつかのWebインタラクティブ機能を追加したいときに突然停止しました。 私が主題で見つけたほとんどの記事は、Flaskフレームワークを使用して動的なWebページを構成することを提案しています。私はFlaskの基本を試して理解しましたが、私が "app.run"関数を呼び出すとFlaskがブロックする問題を回避することはできません。残りのPythonコードはFlaskが返るのを待ちますが、決して起こりません。私。水流測定、バルブモーターステアリング、または表示更新が不要になりました。

私の基本的な質問は次のようなものです:アプリケーションのメインタスク(GPIO/Pulse)と並行して、単純な動的Webページ(1リクエスト/週などの負荷が非常に少ない)を提供するためには、カウント)?このすべては、ラズベリーパイ(3)の資源制約された環境にあります。 Flaskを提案している場合(目標に非常に近いと思われるため)、上記のような現実のイベントを処理するためにコードをどのように整理すればよいですか?

(この最後の部分は、実際のコードを見ない厳しい留守番かもしれませんが、多分それは「一般的な」方法でそれに答えることは可能ですか?または検索しているときに、私が見逃している可能性があります既存の例を指している。)

答えて

0

あなたはマルチスレッドで正しい軌道に乗る。

import threading 
from wherever import monitoring_loop 

monitoring_thread = threading.Thread(target = monitoring_loop) 
monitoring_thread.start() 

# app.run() and whatever else you want to do 

はないjoinスレッドを実行してください:あなたの監視コードがループ内で実行されている場合、あなたはapp.run()を呼び出す前に、その関数を実行するスレッドを起動し、その後

def monitoring_loop(): 
    while True: 
     # do the monitoring 

のような機能を定義することができます - Flaskアプリと並行して稼働させたいと思っています。もしあなたがそれに参加していれば、それは完了するまでメイン実行スレッドをブロックするでしょう。それはwhile Trueループを実行しているので決してありません。

監視スレッドとプログラムの残りの部分との間で通信するには、queueを使用して、スレッド間でスレッドセーフな方法でメッセージを渡すことができます。

+0

うわー! 10分以内にポイント・ツー・ポイントの回答。あなただけのStackOverflowを愛する必要があります!このテクニックを使用しているいくつかの作業コードへのポインタを尋ねるのはとても失礼でしょうか? (それをより大きな文脈で理解するために)。 – Eriond

+0

私は個人的には簡潔な例はありませんが、[PyMOTW 3 post](https://pymotw.com/3/threading/)のポストは簡単な例を紹介したようです。 –

0

私がおそらくこれを処理する方法は、プログラムを2つの異なる別々に動作するプログラムに分割することです。

1つのプログラムはGPIOの監視と通信を処理し、もう1つのプログラムは小さなFlaskサーバです。彼らは別のプロセスとして実行されるため、互いにブロックしません。

2つのプロセスを小さなデータベースで通信することができます。 GIPOインターフェースは、フロー測定値または他の関連データをデータベースのテーブルに定期的に記録することができる。また、要求のキューとして機能するデータベース内の別のテーブルを監視することもできます。

Flaskインスタンスは、同じデータベースにクエリを発行して現在の統計情報を取得し、ユーザー入力に基づいて要求キューにエントリを送信できます。 (GIPOプロセスが要求をキューに現在のステータスで更新する場合、Flaskプロセスはそれをバックアウトすることができます。)

少しのラズベリーパイで使用するデータベースの種類は、sqlite3と非常に小さく軽量なファイルベースのデータベースで、Pythonの標準ライブラリとして十分にサポートされています。 (完全な "データベースサーバー"プロセスを実行する必要はありません)

あなたのプロジェクトには幸運のようですね!

関連する問題