2017-07-18 18 views
0

Flaskを使用してPython Webアプリケーションとして実行中のサービスを開始および停止しようとしています。このサービスには、マイク入力を聞いて、入力があらかじめ定義されたしきい値を超えた場合に何らかのアクションをとって、連続的に実行するループが含まれます。私は/ onパラメータでurlが渡されたときに実行を開始させることができますが、一度起動すれば停止する方法が見つかりません。 request.args.getを使用してurlパラメータの状態を監視し、/から/への変更を監視しようとしましたが、何らかの理由でプログラムがクエリ文字列を変更しようとしたことを登録しません実行を中止する。私のコードを実行し、urlパラメータが/からon/offに変更されたときにコードを停止する方法がありますか?どんな助けでも大歓迎です!Python Flaskでループ内のurlパラメータの変更をチェックする方法

import alsaaudio, time, audioop 
import RPi.GPIO as G 
import pygame 
from flask import Flask 
from flask import request 
app = Flask(__name__) 

G.setmode(G.BCM) 
G.setup(17,G.OUT) 
pygame.mixer.init() 
pygame.mixer.music.load("/home/pi/OceanLoud.mp3") 

@app.route('/autoSoothe', methods=['GET','POST']) 
def autoSoothe(): 
     toggle = request.args.get('state') 
     print(toggle) 
     if toggle == 'on': 
# Open the device in nonblocking capture mode. The last argument could 
# just as well have been zero for blocking mode. Then we could have 
# left out the sleep call in the bottom of the loop 
       inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE,alsaaudio.PCM_NONBLOCK,'null',0) 

# Set attributes: Mono, 8000 Hz, 16 bit little endian samples 
      inp.setchannels(1) 
      inp.setrate(8000) 
      inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) 

# The period size controls the internal number of frames per period. 
# The significance of this parameter is documented in the ALSA api. 
# For our purposes, it is suficcient to know that reads from the device 
# will return this many frames. Each frame being 2 bytes long. 
# This means that the reads below will return either 320 bytes of data 
# or 0 bytes of data. The latter is possible because we are in nonblocking 
# mode. 
      inp.setperiodsize(160) 

      musicPlay = 0 

      while toggle == 'on': 
        toggle = request.args.get('state') 
        print(toggle) 
        if toggle == 'off': 
          break 
    # Read data from device 

        l,data = inp.read() 
        if l: 
          try: 
    # Return the maximum of the absolute value of all samples in a fragment. 
            if audioop.max(data, 2) > 20000: 
              G.output(17,True) 
              musicPlay = 1 
            else: 
              G.output(17,False) 

            if musicPlay == 1: 
              pygame.mixer.music.play() 
              time.sleep(10) 
              pygame.mixer.music.stop() 
              musicPlay = 0 

          except audioop.error, e: 
            if e.message != "not a whole number of frames": 
              raise e 

          time.sleep(.001) 

    return toggle 

if __name__ == "__main__": 
    app.run(host='0.0.0.0', port=5000, debug=True) 

答えて

0

は、HTTPリクエストをフラスコのクライアントからサーバに行われると、クライアントは、一つのリクエストを送信し、サーバからの応答を待ちます。つまり、stateパラメータを送信すると、クライアントがそれを遡及的に変更する方法はありません。

目的の動作をさせる方法はいくつかあります。

私の頭に浮かぶのは、非同期コードを使うことです。 stateが「オン」のときにスレッド/プロセスを開始し、要求を終了するコードを作成できます。このスレッドはあなたのオーディオループを実行します。その後、クライアントは別の要求を送信することができますが、stateは「オフ」になっています。これは、他のプロセスに正常に停止するよう警告する可能性があります。

Hereマルチプロセッシングについての情報です。しかし、Celeryなどを使用してFlaskで同様のことを行う方法に関する多くの情報があります。

+0

ありがとうEpicDavi。私は間違いなくこれを見てみましょう! –

関連する問題