2013-09-26 35 views

Trả lời

11

coverage gunicorn <params> không hoạt động, vì gunicorn tạo quy trình công nhân và mô-đun coverage không thể hoạt động trên các nhánh (về cơ bản, tạo các quy trình mới). Bạn có thể sử dụng the coverage API Mặc dù vậy, ví dụ như trong các mô-đun python có chứa ứng dụng WSGI của bạn:

# 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) 

Sau đó chạy gunicorn -w 1 wsgi_with_coverage:application <other params>.

Vấn đề là, các chức năng atexit không được gọi nếu bạn giết quá trình gunicorn, ví dụ: thông qua CTRL + C. Nhưng họ được gọi là SIGHUP, vì vậy nếu bạn làm kill -HUP $(cat <gunicorn_pidfile_here>), dữ liệu bảo hiểm phải được lưu (theo mặc định thành ".coverage" trong thư mục hiện tại).

Có thể báo trước là điều này sẽ không hoạt động với nhiều hơn một nhân viên gunicorn, bởi vì tất cả họ sẽ ghi đè lên tệp ".coverage". Nếu bạn hoàn toàn cần nhiều hơn một công nhân, bạn có thể viết thư cho ".coverage-%d" % os.getpid() (đặt tên tệp via the data_file parameter to the coverage constructor) và sử dụng the combine() method để hợp nhất các phép đo riêng lẻ.

Điều này cũng sẽ hoạt động trên các máy chủ WSGI khác, tùy thuộc vào việc liệu chúng có cho phép quy trình làm việc của nhân viên dọn sạch thông qua phương thức atexit hay không.

+0

Lời khuyên SIGHUP không tốt lắm :). Gunicorn tải lại các quy trình công nhân khi truy xuất SIGHUP. Tức là, dữ liệu được thu thập chính xác không được lưu, nhưng được ghi đè bằng những điều chỉ xảy ra khi tải. Việc gửi SIGTER, mặt khác, kích hoạt đúng trình xử lý ngoại tuyến và tắt Gunicorn một cách rõ ràng. –

Các vấn đề liên quan