gunicorn和uwsgi是怎麼在使用gevent的,gunicorn/uwsgi和gevent?
gunicorn/uwsgi 和 gevent 各自充當的角色是什麼,也就是說他們各自是在做什麼事情,gunicorn/uwsgi 是在解決哪個問題,gevent又是在解決哪個問題?
另外gunicorn和uwsgi哪一個性能更好
現在一般python做web主要有三大部分,web server, web framework, async io.
web server 承擔埠監聽和接受請求的任務
web framework 主要承擔路由,業務邏輯等任務有了web server和web framework基本就能運行了。一般web framework庫(比如flask),主要部分是web framework, 同時也自帶一個性能不咋滴的web server,這樣你在開發和調試時可以直接運行起來看看效果,但是在生產環境中,它自帶的web server性能就不夠用了。
除了這種性能不咋地的自帶的web server,還有像gunicorn和uwsgi這種單獨實現的性能強勁的web server,這種單獨實現的web server和web framework配合起來用就可以提高整個應用的性能。
由於python的多線程基本就是個擺設,python web中一般用協程+非同步IO的方式來實現並發。gevent就是一個協程+非同步IO的庫,其作用是將阻塞的應用變為非阻塞,來提高並發量。
總結,gunicorn和uwsgi是web server, flask或者bottle是web framework, gevent是async io。
目前大部分測試下,uwsgi比gunicorn性能更好。uwsgi是C語言實現,gunicorn是純Python實現,如果gunicorn有pypy加成應該性能會有所提高。gunicorn/uwsgi都是wsgi協議(python web server gateway interface)的實現,它們做的事情是協議轉換,協議的一頭是web app(如flask, django等framework的app),另一頭是web server(如apache, nginx等),gunicore/uwsgi在默認的情況下都是同步模型,但都比通常的web framework實現得好。
gevent是利用協程(greenlet庫)實現的一個高性能非同步IO的庫,它做的事情就是實現非同步模型。
gunicorn/uwsgi可以配合gevent實現非同步模型,並發能力進一步提高(在沒有gevent的情況下,並發能力其實來自於web server)。
以上說的都是他們的本職工作,但實際上它們都做了更多的事,如:
gunicorn/uwsgi都實現了自己的web server,可以不依賴nginx等專業server獨立提供web服務;gevent實現了wsgi,可以不依賴gunicorn/uwsgi等完成協議轉換(非同步模型下的)。至於哪一種配置性能好我就不知道了,可以找找別人做過的測評,而且估計性能也得具體的應用有些關係,如果很重要的話不妨拿自己的應用測一測,如果是要開一個新項目的話,隨便選一個就好了,也不會差很多。
推薦閱讀: