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等完成協議轉換(非同步模型下的)。

至於哪一種配置性能好我就不知道了,可以找找別人做過的測評,而且估計性能也得具體的應用有些關係,如果很重要的話不妨拿自己的應用測一測,如果是要開一個新項目的話,隨便選一個就好了,也不會差很多。


推薦閱讀:

gevent、eventlet、Twisted、Tornado各有什麼區別和優劣?

TAG:Python | Flask | Python框架 | uwsgi | gevent |