Python 2 執行階段環境

您可以透過 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 入門指南提供互動式簡介,內容介紹如何使用 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 能跨多個網路伺服器發布應用程式要求,並且避免應用程式彼此干擾,應用程式會在受到限制的「沙箱」環境中執行。 在這個環境中,應用程式可以執行程式碼、儲存及查詢 Cloud Datastore 中的資料、使用 App Engine 郵件、網址擷取以及使用者服務,也可以檢查使用者的網路要求,以及準備回應。

App Engine 應用程式做不到的事情如下:

  • 寫入檔案系統。應用程式必須使用 Cloud 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 擴充功能

執行緒

您可以使用 threadthreading 模組在 Python 2.7 版中建立執行緒。提醒您,執行階段會在要求結束時合併執行緒,因此執行緒就無法在要求結束後執行。

背景執行緒

手動或基本資源調度執行個體執行的程式碼可以啟動一個背景執行緒,這個執行緒的期限可以超過產生其本身之要求的期限。如此一來,執行個體便可執行任意定期或排程工作,將要求傳回使用者後,也可以繼續在背景執行。

背景執行緒的 os.environ 和記錄項目不同於產生執行緒的這些項目。

您必須自 App Engine 的 SDK 匯入 google.appengine.api.background_thread 模組。

from google.appengine.api import background_thread

BackgroundThread 類別就像一般 Python threading.Threadclass 類別,但期限可「超過」產生類別的要求本身的期限。另有一個 start_new_background_thread() 函式,會建立並啟動背景執行緒:

# sample function to run in a background thread
def change_val(arg):
    global val
    val = arg

if auto:
    # Start the new thread in one command
    background_thread.start_new_background_thread(change_val, ['Cat'])
else:
    # create a new thread and start it
    t = background_thread.BackgroundThread(
        target=change_val, args=['Cat'])
    t.start()
App Engine API 可為每個執行個體建立的並行背景執行緒數量上限為 10 個。這項限制不適用於與 App Engine API 無關的一般 Java 執行緒。

工具

SDK for App Engine 包含各種工具,像是用於測試應用程式、上傳應用程式檔案、管理 Cloud Datastore 索引、下載記錄資料,以及將大量資料上傳至 Cloud Datastore 的工具。

開發伺服器會在本機電腦上執行您的應用程式,以測試應用程式。伺服器會模擬 Cloud Datastore 服務和沙箱限制。開發伺服器也會根據應用程式在測試期間執行的查詢,產生 Cloud Datastore 索引的設定。

gcloud 工具會處理指令列與 App Engine 上執行應用程式的所有互動。您需使用 gcloud app deploy 將應用程式上傳至 App Engine,或是更新個別設定檔,例如 Cloud Datastore 索引設定,以利在部署程式碼之前建構新的索引。您也可以查看應用程式的記錄資料,以利使用自己的工具分析應用程式效能。

並行與延遲

應用程式的延遲對提供流量所需的執行個體數量影響最大。如果快速處理要求,一個執行個體就能處理許多要求。

單執行緒執行個體可以處理一個並行要求。因此,延遲與執行個體每秒能夠處理的要求數量之間具有直接關係。例如,延遲 10 毫秒相當於每個執行個體每秒 100 個要求。

多執行緒執行個體可以處理許多並行要求。因此,耗用的 CPU 和每秒要求數之間存在直接關聯。

Python 2.7 版應用程式支援並行要求。因此,單一執行個體可以一邊處理新要求一邊等待其他要求完成。這項功能可大幅減少應用程式所需的執行個體數量,不過您需要設計支援多執行緒的應用程式。

例如,若一個 B4 執行個體 (約 2.4GHz) 處理一個要求需耗用 10 個 Mcycle,那麼您的每個執行個體每秒可以處理 240 個要求。若處理每個要求需耗用 100 個 Mcycle,則您的每個執行個體每秒可以處理 24 個要求。這些數字是理想情形,不過針對可在一個執行個體上完成的工作而言,算是相當實際。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境