- 摘要
本文是建立在分析CherryPy的Hello World及背後的源碼基礎上的,旨在分析支持Hello World運行的CherryPy框架。
- 概述
CherryPy 3.2.2作爲Web Application Server,支撐着CherryPy的Application的運行。相關的背景資料可以參考《關於cherrypy和wsgidav的一些問題》。
- Hello World
源碼如下:
import cherrypy
class HelloWorld:
def index(self):
return "Hello world!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
- CherryPy框架
支撐運行Hello World的CherryPy的框架大致如下圖所示,圖中的節點名稱是CherryPy中的類名。
當一個請求發生時,首先到達的是CPWSGIServer,CPWSGIServer基於socket,win32下對應的底層支持module是process/win32.py。由於CherryPy支持WSGI接口的應用,故CPWSGIServer也能支撐WSGI應用。
CPWSGIServer會將每個請求封裝成一個HTTPConnection,然後扔到隊列Queue裏面,由ThreadPool中的WorkerThread來處理,處理方式很簡單,就是ThreadPool啓動多個WorkerThread,每個WorkerThread去Queue中取HTTPConnection,然後處理之。CherryPy中,可以設置WorkerThread的個數。
ThreadPool模塊和_cp開頭的module的交互是通過_cpserver.Server,它只是一個Adapter,包裝了底層的Server類。HTTPConnection會將消息轉發到_cptree.Tree,該類中記載了站點的相對路徑(比如“/”)和對應的Application之間的對應關係,那麼它會跟據不同的URL請求轉到對應的Application中。
Application中則封裝了用戶定義的類HelloWorld對象,故在需要返回數據給客戶端時,調用到HelloWorld中。