您可以透過 App Engine 使用 Python 程式設計語言建構網頁應用程式,並充分運用專業開發人員用於建構世界級網頁應用程式的眾多 Python 專用程式庫、工具以及架構。您的 Python 應用程式會採用 Google 的可擴充基礎架構執行,並且使用大規模的永久儲存空間與服務。
簡介
App Engine 會在「採用沙箱機制」的安全環境中使用預先載入的 Python 解譯器執行 Python 應用程式碼。您的應用程式會與這個環境互動,並且接收網路要求、執行工作,然後傳送回應。
Python 網路應用程式使用 WSGI 通訊協定與 App Engine 網路伺服器互動,因此應用程式可以使用任何與 WSGI 相容的網路應用程式架構。App Engine 包含一個簡易的網路應用程式架構,稱為 webapp2,可以讓您輕鬆上手。如果是大型應用程式,成熟的第三方架構 (例如 Django) 與 App Engine 搭配使用時運作良好。
Python 解譯器可以執行任何 Python 程式碼,包括您的應用程式中所含的 Python 模組,以及 Python 標準程式庫。解譯器無法使用 C 程式碼載入 Python 模組;這是「純粹的」Python 環境。
安全的「沙箱」環境會隔離您的應用程式,只用於發揮服務及安全用途。這個環境會確認應用程式只能執行不干擾其他應用程式效能與擴充性的操作。例如,應用程式無法將資料寫入本機檔案系統,也無法任意建立網路連線,而是使用 App Engine 提供的可擴充服務,透過網際網路儲存資料及進行通訊。應用程式若從已知無法在沙箱限制範圍內正常運作的標準程式庫,嘗試匯入 Python 模組,Python 解譯器會引發例外狀況。
App Engine 平台提供許多服務,您的程式碼可以呼叫這些服務。您的應用程式也可以設定會按指定間隔執行的排程工作。
選取 Python 2 執行階段
您必須在 app.yaml
設定檔中指定 Python 執行階段環境,再使用該檔案將應用程式部署至 App Engine。舉例來說,您可以將下列內容新增至 app.yaml
檔案,即可使用 Python 2.7 版:
runtime: python27
api_version: 1
threadsafe: true
...
第一個元素 runtime
會選取 Python 執行階段環境。
第二個元素 api_version
會選取要使用的 Python 執行階段環境版本。截至本文撰寫時,App Engine 只有一個版本的 Python 環境,即 1
。如果 App Engine 團隊需要發佈環境變更,且這些變更可能無法與現有的程式碼相容時,他們會使用新的版本識別碼。在您變更 api_version
設定並上傳應用程式之前,您的應用程式會繼續使用所選版本。
如要進一步瞭解 app.yaml
檔案,以及如何將應用程式部署至 App Engine,請參閱「app.yaml
參考資料」、「遷移至 Python 2.7」和「部署 Python 應用程式」主題。
沙箱
如要讓 App Engine 將應用程式要求分散到多部網路伺服器,並且避免應用程式彼此干擾,應用程式會在受到限制的「沙箱」環境中執行。在這個環境中,應用程式可以執行程式碼、儲存及查詢 Datastore 中的資料、使用 App Engine 郵件、網址擷取以及使用者服務,也可以檢查使用者的網路要求,以及準備回應。App Engine 應用程式做不到的事情如下:
寫入檔案系統。應用程式必須使用 Datastore 儲存永久資料。您可以從檔案系統讀取,而且可以使用所有以應用程式上傳的應用程式檔案。
慢速回應。應用程式收到的網路要求必須在幾秒內處理完畢。處理序所需的回應時間如果太長,就會終止,以免導致網路伺服器負荷過重。
發出其他種類的系統呼叫。
在 Python 中使用沙箱
您可以在使用 Python 2.7 執行階段時上傳及使用 .pyc
檔案,但無法上傳相同檔案的 .py
和 .pyc
版本。您可以上傳包含 .py
或 .pyc
檔案 (或兩者組合) 的 .zip 檔案。如要上傳 .pyc
檔案,請留意下列三項要點:
- 若是 CGI 指令碼,即使您上傳的是
.pyc
檔案,指令碼處理常式仍應使用.py
副檔名。 - 部署時預設會跳過
.pyc
檔案。您必須在app.yaml
檔案中覆寫skip_files
元素,以免新值導致系統略過.pyc
檔案。 - 您必須使用 Python 2.7 建構
.pyc
檔案。如果開發電腦安裝的是不同版本的 Python (例如 Python 2.6),那麼您必須取得 2.7 版才能建構相容的.pyc
檔案。
單純只用 Python 2
所有 Python 執行階段環境的程式碼皆須是純粹的 Python,而且不包含任何 C 擴充模組或是其他必須編譯的程式碼。
這個環境包含 Python 標準程式庫。部分模組已停用,因為 App Engine 不支援這些模組的核心功能,例如網路連線或寫入檔案系統。此外,os
模組可供使用,但不支援的功能會停用。如果嘗試匯入不支援的模組或使用不支援的功能,系統會擲回例外狀況。
已取代或自訂標準程式庫中的少數模組,以利與 App Engine 搭配使用。這些模組因兩個不同的 Python 執行階段而異,如下所述。
Python 2.7 版中的自訂程式庫
Python 2.7 版執行階段已替換或自訂下列模組:
除了 Python 標準程式庫和 App Engine 程式庫外,Python 2.7 版執行階段還包含數個第三方程式庫。
新增第三方 Python 程式庫
您可以在應用程式目錄中放置程式碼,以利在應用程式中加入第三方 Python 程式庫。若在應用程式目錄中使用連結至程式庫目錄的符號連結,則會以該連結為準,也會將程式庫包含在您部署至 App Engine 的應用程式。
Python 模組的包含路徑會納入應用程式的根目錄,也就是包含 app.yaml
檔案的目錄。您在應用程式根目錄中建立的 Python 模組,皆可透過從根開始的路徑使用。請務必在子目錄中建立必要的 __init__.py
檔案,以便 Python 將這些子目錄視為套件。此外,請確認程式庫不需要任何 C 擴充功能。
討論串
您可以使用 thread
或 threading
模組在 Python 2.7 版中建立執行緒。提醒您,執行階段會在要求結束時合併執行緒,因此執行緒就無法在要求結束後執行。
背景執行緒
在手動或基本資源調度執行個體執行的程式碼可以啟動一個背景執行緒,這個執行緒的期限可以超過產生其本身之要求的期限。如此一來,執行個體便可執行任意定期或排程工作,將要求傳回使用者後,也可以繼續在背景執行。
背景執行緒的 os.environ
和記錄項目與產生執行緒的元件不同。
您必須從 App Engine 的 SDK 匯入 google.appengine.api.background_thread
模組。
BackgroundThread 類別就像一般 Python threading.Threadclass
,但期限可「超過」產生類別的要求本身的期限。還有 start_new_background_thread()
函式,可建立並啟動背景執行緒:
工具
App Engine 專用 SDK 包含用於測試應用程式、上傳應用程式檔案、管理 Datastore 索引、下載記錄資料,以及將大量資料上傳至 Datastore 的工具。
開發伺服器會在本機電腦上執行您的應用程式,以測試應用程式。伺服器會模擬 Datastore 服務和沙箱限制。開發伺服器也會根據應用程式在測試期間執行的查詢,產生 Datastore 索引的設定。
gcloud
工具會處理指令列與 App Engine 上執行應用程式的所有互動。您可以使用 gcloud app deploy
將應用程式上傳至 App Engine,或是更新 Datastore 索引設定等個別設定檔,以便在部署程式碼前建構新的索引。您也可以查看應用程式的記錄資料,以利使用自己的工具分析應用程式效能。
並行與延遲
應用程式的延遲對提供流量所需的執行個體數量影響最大。若快速處理要求,一個執行個體就能處理許多要求。
單執行緒執行個體可以處理一個並行要求。因此,延遲與執行個體每秒能夠處理的要求數量之間具有直接關係。例如,延遲 10 毫秒相當於每個執行個體每秒處理 100 個要求。多執行緒執行個體可以處理許多並行要求。因此,耗用的 CPU 和每秒要求數之間存在直接關聯。
Python 2.7 版應用程式支援並行要求。因此,單一執行個體可以一邊處理新要求一邊等待其他要求完成。這項功能可大幅減少應用程式所需的執行個體數量,不過您需要設計支援多執行緒的應用程式。
例如,若一個 B4 執行個體 (約 2.4GHz) 處理一個要求需耗用 10 個 Mcycle,那麼您的每個執行個體每秒可以處理 240 個要求。若處理每個要求需耗用 100 個 Mcycle,則您的每個執行個體每秒可以處理 24 個要求。這些數字是理想情形,不過針對可在一個執行個體上完成的工作而言,算是相當實際。
環境變數
下列為執行階段設定的環境變數:
環境變數 | 說明 |
---|---|
GAE_APPLICATION
|
App Engine 應用程式的 ID。這個 ID 的前置字串為「region code~」,例如在歐洲部署的應用程式為「e~」。 |
GAE_DEPLOYMENT_ID |
目前部署的 ID。 |
GAE_ENV |
App Engine 環境。設為 standard 。 |
GAE_INSTANCE |
服務目前正在執行的執行個體 ID。 |
GAE_RUNTIME |
app.yaml 檔案中指定的執行階段。 |
GAE_SERVICE |
在 app.yaml 檔案中指定的服務名稱。如果未指定服務名稱,則會設為 default 。 |
GAE_VERSION |
服務目前的版本標籤。 |
GOOGLE_CLOUD_PROJECT |
與應用程式相關聯的 Google Cloud 專案 ID。 |
PORT |
接受 HTTP 要求的通訊埠。 |
您可以在 app.yaml
檔案中定義其他環境變數,但無法覆寫上述的值。