2013-01-08 15 views
7

いくつかのリソースをフェッチするためにAPScheduler(スレッドプールを使用する)を使用するシステムを実装しています。uWSGIと正常にマルチスレッドFlaskアプリケーションを殺す

私はAPSchedulerスレッドプールをシャットダウンできるように "アプリの再起動"を検出する方法を見つけようとしています。私はSIGHUPをuWSGIマスタープロセスに送信して再起動します。

これまで誰かが試したことがありますか?その場合は、アプリの再起動イベントを検出する正しい方法は何ですか?

  • uwsgidecoratorsは私のスレッドが実行されてもuWSGIがリクエストを処理しないよう
  • uwsgiモジュールはsignal_waitsignal_received機能

signal_wait機能ブロックを持っている、postforkデコレータを持っています。私もscheduler.daemonicをFalseとTrueに設定しようとしました。どちらの方法でも役に立ちません。私はAPSchedulerスレッドプールをシャットダウンすることができるようになりますように「アプリの再起動」を検出する方法を把握しようとしています

worker 1 (pid: 20082) is taking too much time to die...NO MERCY !!!

答えて

1

:uWSGIプロセスはまだこのような何かをログに記録します。

私は確かにアプリの再起動を検出するための簡単な方法がないと思いますが、uwsgiは、リロード後にコードを実行したり、これらの方法で、シャットダウンすることができます

1)コードは、別のプロセスで実行されます:追加フックなど - ユーザーのatexitあなたuwsgi設定に

012:

[uwsgi] 
... 
hook-as-user-atexit = exec:python finalization.py 

2)労働者のいずれかに呼び出されます

3)この場合、touch uwsgi.pidをリロードする必要があります。唯一のリロード後、労働者のいずれかに呼び出されます:

[uwsgi] 
... 
pidfile = ./uwsgi.pid 
touch-reload = ./uwsgi.pid 

Pythonコード:

import uwsgi 

def will_executed_after_reload(*args): 
    print("I was invoked") 

uwsgi.register_signal(17, "worker", will_executed_after_reload) 
uwsgi.add_file_monitor(17, "./uwsgi.pid") 
関連する問題