2017-09-19 19 views
0

複数のオプションをテストしています。Pythonマルチプロセッシング:子プロセスが終了しましたが、pidは残っています

Flaskアプリケーションを実行していて、「停止」信号によって終了するまで実行中の別のプロセス内でバックグラウンド機能を開始および停止できるようにしました。

これはうまくいきますが、私が直面している問題は、終了したにもかかわらず、PIDと終了コード(0、-15、-9)があることです。

それが生成するので、その結果、ユーザーがその機能を再起動することはできませんが。

てAssertionError:あなたは二回のプロセスを開始することができません。

背景機能を再度開始するには、Flaskアプリを再起動する必要があります。ここでは、バックグラウンド関数のコードは次のとおりです。

class background_function(Process): 

    def __init__(self): 
    Process.__init__(self) 
    self.exit = Event() 

    def shutdown(self): 
    self.exit.set() 


    def run(self): 
     #some variables declared here, and a try/except to verify that the 
     #remote device is online (a pi zero, function is using the remote gpio) 
    while not self.exit.is_set(): 
     #code 

とHTMLページ上のボタンのクリックによってトリガフラスコルート、:psutil事は私の最後の試みであり、そして与えること

proc = background_function() 

@app.route('/_run', methods=['GET']) 
def run(): 
    if proc.pid is None: 
     try: 
      proc.start() 
      sleep(2) 

    if proc.is_alive(): 
     return('Active') 

    else: 
     proc.shutdown() 
     sleep(0.1) 
     return('FAILED') 

    except Exception as e: 
     print(e) 
     proc.shutdown() 


    else: 
     p = psutil.Process(proc.pid) 
     p.kill() 
     return ('DISABLED') 

注意process.terminate()を使用した場合、またはバックグラウンド関数がクラスではなく単一の関数である場合とまったく同じ結果になります。私はここでアイデアを使い果たしているので、助けやアドバイスは大歓迎です。

+0

プロセスを実行することはできません言ったように私はあなたが再しなければならないと思います - プロセスを初期化する。あなたはここでも同じプロセスを使います: 'Process .__ init __(self)'。私はこれが '実行'に置かれるべきだと思う。 –

+0

ハ。ありがとうございました...私は文書を読んでいましたが、「プロセスごとに最大で1回呼び出す必要がありますが、プロセスを終了した後に「リセット」されると考えました。私はそれが愚かな間違いだったとかなり確信していた:@ –

+0

私は再テストし、仕事をすることを管理しているので、大丈夫です。 M Dennisのソリューションに加えて、私はprocグローバルなグローバルprocを作成し、Flaskルートのdef run()でproc = background_function()を再宣言しなければなりませんでした。クラスの 'def __init __(self)'に 'super().__ init __()'を追加しなければなりませんでした。 –

答えて

0

class background_function(Process): 

    def shutdown(self): 
    self.exit.set()  

    def run(self): 
    Process.__init__(self) 
    self.exit = Event() 
     #some variables declared here, and a try/except to verify that the 
     #remote device is online (a pi zero, function is using the remote gpio) 
    while not self.exit.is_set(): 
     #code 

あなたは同じプロセスを常に参照しますが、エラーメッセージは、あなたが二回

0

multiprocessing documentationには、Process.startを「プロセスごとに最大で1回呼び出す必要があります」と記載されています。同じ機能を再度実行する場合は、新しいプロセスオブジェクトを作成する必要があります。

私はあなたの background_functionはこのように見えることがあると思い
関連する問題