2013-09-26 76 views

回答

11

coverage gunicorn <params>不起作用,因爲gunicorn創建工作進程,並且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>

問題是,如果殺死gunicorn進程,例如通過CTRL + C,則不會調用atexit函數。但他們呼籲SIGHUP,所以如果你做kill -HUP $(cat <gunicorn_pidfile_here>),覆蓋率數據應保存(默認爲當前目錄「.coverage」)。

一個可能的警告是,這不適用於多個gunicorn工作者,因爲他們會覆蓋「.coverage」文件。如果您絕對需要多名工作人員,則可以寫入".coverage-%d" % os.getpid()(設置文件名稱via the data_file parameter to the coverage constructor)並使用the combine() method合併單個測量。

這也應該在其他WSGI服務器上工作,具體取決於它們是否允許通過atexit方法清除其工作進程。

+0

SIGHUP的建議是不是很好:)。 Gunicorn在檢索SIGHUP時重新加載工作進程。也就是說,收集到的覆蓋率數據完全沒有保存,而是覆蓋了僅在加載時發生的事情。另一方面,發送SIGTER會正確觸發atexit處理程序並乾淨地關閉Gunicorn。 –

相關問題