2013-09-26 2 views

答えて

11

coverage gunicorn <params>は、作業者プロセスを作成し、coverageモジュールはフォーク(基本的には新しいプロセスの作成)で動作できないため機能しません。あなたのWSGIアプリケーションが含まれているPythonのモジュール、例えば、しかし、the coverage API使用することができます。

# wsgi_with_coverage.py 
import atexit 
import sys 
import coverage 
cov = coverage.coverage() 
cov.start() 

from wsgi import application # adjust to python module containing your wsgi application 


def save_coverage(): 
    print >> sys.stderr, "saving coverage" 
    cov.stop() 
    cov.save() 

atexit.register(save_coverage) 

その後gunicorn -w 1 wsgi_with_coverage:application <other params>を実行します。

問題は、CTRL + Cを使用してガンコンプロセスを終了すると、atexit関数が呼び出されないということです。しかしSIGHUPで呼び出されるですので、kill -HUP $(cat <gunicorn_pidfile_here>)を実行すると、カバレッジデータは(デフォルトでカレントディレクトリに ".coverage"に)保存する必要があります。

".coverage"ファイルをすべて上書きする可能性があるため、複数のgunicornワーカーでは動作しない可能性があります。複数の作業者が絶対必要な場合は、".coverage-%d" % os.getpid()(ファイル名はvia the data_file parameter to the coverage constructorに設定)に書き込み、the combine() methodを使用して個々の測定値をマージすることができます。

これは、ワーカープロセスがatexitメソッドでクリーンアップできるかどうかによって、他のWSGIサーバーでも機能するはずです。

+0

SIGHUPのアドバイスはあまり良くありません:)。 GunicornはSIGHUPの取得時にワーカープロセスをリロードします。つまり、収集されたカバレッジ・データは正確には保存されませんが、ロード時にのみ発生するもので上書きされます。一方、SIGTERを送信すると、atexitハンドラが正しく起動され、Gunicornが正常に終了します。 –

関連する問題