Lingkungan Runtime Python 2

Dengan App Engine, Anda dapat membangun aplikasi web menggunakan bahasa pemrograman Python, serta manfaatkan berbagai library, alat, dan framework untuk Python yang digunakan developer profesional untuk membangun aplikasi web kelas dunia. Aplikasi Python Anda berjalan di infrastruktur skalabel Google, dan menggunakan layanan serta penyimpanan persisten berskala besar.

Pengantar

App Engine menjalankan kode aplikasi Python Anda menggunakan penafsir Python yang telah dimuat sebelumnya di lingkungan "sandbox" yang aman. Aplikasi Anda menerima permintaan web, melakukan pekerjaan, dan mengirim respons melalui interaksi dengan lingkungan ini.

Aplikasi web Python berinteraksi dengan server web App Engine menggunakan protokol WSGI, sehingga aplikasi dapat menggunakan framework aplikasi web yang kompatibel dengan WSGI. App Engine menyertakan framework aplikasi web sederhana yang disebut webapp2, untuk memudahkan Anda memulai. Untuk aplikasi yang lebih besar, framework pihak ketiga yang matang, seperti Django, berfungsi baik dengan App Engine.

Penafsir Python dapat menjalankan kode Python apa pun, termasuk modul Python yang disertakan dengan aplikasi Anda, serta library standar Python. Penafsir tidak dapat memuat modul Python dengan kode C; ini adalah lingkungan Python yang "murni".

Lingkungan "sandbox" yang aman mengisolasi aplikasi Anda untuk mendapatkan layanan dan keamanan. Fitur ini memastikan bahwa aplikasi hanya dapat melakukan tindakan yang tidak mengganggu performa dan skalabilitas aplikasi lain. Misalnya, aplikasi tidak dapat menulis data ke sistem file lokal atau membuat koneksi jaringan arbitrer. Sebagai gantinya, aplikasi menggunakan layanan skalabel yang disediakan oleh App Engine untuk menyimpan data dan berkomunikasi melalui internet. Penafsir Python mengajukan pengecualian saat aplikasi mencoba mengimpor modul Python dari library standar yang diketahui tidak berfungsi dalam pembatasan sandbox.

Platform App Engine menyediakan banyak layanan yang dapat dipanggil oleh kode Anda. Aplikasi Anda juga dapat mengonfigurasi tugas terjadwal yang berjalan pada interval tertentu.

Memilih runtime Python 2

Anda menentukan lingkungan runtime Python di file konfigurasi app.yaml, yang digunakan untuk men-deploy aplikasi Anda ke App Engine. Misalnya, Anda menambahkan kode berikut ke file app.yaml untuk menggunakan Python versi 2.7:

runtime: python27
api_version: 1
threadsafe: true
...

Elemen pertama, runtime, memilih lingkungan runtime Python.

Elemen kedua, api_version, memilih versi lingkungan runtime Python yang akan digunakan. Pada saat penulisan ini, App Engine hanya memiliki satu versi lingkungan Python, 1. Jika tim App Engine perlu merilis perubahan pada lingkungan yang mungkin tidak kompatibel dengan kode yang ada, tim App Engine akan melakukannya dengan ID versi baru. Aplikasi Anda akan terus menggunakan versi yang dipilih sampai Anda mengubah setelan api_version dan mengupload aplikasi.

Untuk mengetahui informasi selengkapnya tentang file app.yaml dan cara men-deploy aplikasi Anda ke App Engine, lihat topik Referensi app.yaml, Bermigrasi ke Python 2.7, dan Men-deploy Aplikasi Python.

Sandbox

Agar App Engine dapat mendistribusikan permintaan aplikasi di beberapa server web, dan mencegah satu aplikasi mengintervensi server web lainnya, aplikasi akan berjalan di lingkungan "sandbox" yang dibatasi. Di lingkungan ini, aplikasi dapat menjalankan kode, menyimpan, dan membuat kueri data di Datastore, menggunakan email App Engine, URL-fetch, dan layanan pengguna, serta memeriksa permintaan web pengguna dan menyiapkan respons.

Aplikasi App Engine tidak dapat:

  • menulis ke sistem file. Aplikasi harus menggunakan Datastore untuk menyimpan data persisten. Membaca dari sistem file diizinkan, dan semua file aplikasi yang diupload dengan aplikasi tersedia.

  • merespons dengan lambat. Permintaan web ke aplikasi harus ditangani dalam beberapa detik. Proses yang memerlukan waktu sangat lama untuk merespons dihentikan agar tidak kelebihan beban pada server web.

  • melakukan jenis panggilan sistem lain.

Sandbox di Python

Anda dapat mengupload dan menggunakan file .pyc saat menggunakan runtime Python 2.7, tetapi Anda tidak dapat mengupload versi .py dan .pyc dari file yang sama. Anda dapat mengupload file .zip yang berisi file .py atau .pyc (atau kombinasinya). Sejumlah peringatan penting berlaku jika Anda mengupload file .pyc:

  • Untuk skrip CGI, pengendali skrip tetap harus menggunakan ekstensi file .py, meskipun Anda mengupload file .pyc.
  • Secara default, file .pyc dilewati selama deployment. Anda harus mengganti elemen skip_files di file app.yaml agar nilai baru tidak menyebabkan file .pyc dilewati.
  • Anda harus menggunakan Python 2.7 untuk membangun file .pyc. Jika memiliki versi Python yang berbeda (seperti Python 2.6) di mesin pengembangan, Anda harus mendapatkan versi 2.7 untuk membangun file .pyc yang kompatibel.

Python 2 Murni

Semua kode untuk lingkungan runtime Python harus berupa Python murni, dan tidak menyertakan ekstensi C atau kode lain yang harus dikompilasi.

Lingkungan ini mencakup library standar Python. Beberapa modul telah dinonaktifkan karena fungsi intinya tidak didukung oleh App Engine, seperti jaringan atau penulisan ke sistem file. Selain itu, modul os tersedia, tetapi fitur yang tidak didukung dinonaktifkan. Upaya untuk mengimpor modul yang tidak didukung atau menggunakan fitur yang tidak didukung akan menghasilkan pengecualian.

Beberapa modul dari library standar telah diganti atau disesuaikan agar berfungsi dengan App Engine. Modul-modul ini bervariasi di antara dua runtime Python, seperti yang dijelaskan di bawah ini.

Library yang disesuaikan di Python versi 2.7

Pada runtime Python versi 2.7, modul berikut telah diganti atau disesuaikan:

  • tempfile dinonaktifkan, kecuali untuk TemporaryFile yang diberi alias ke StringIO.

  • logging tersedia dan penggunaannya sangat disarankan! Lihat Logging.

Selain library standar Python dan library App Engine, runtime Python versi 2.7 menyertakan beberapa library pihak ketiga.

Menambahkan Library Python Pihak Ketiga

Anda dapat menyertakan library Python pihak ketiga bersama aplikasi Anda dengan menempatkan kode di direktori aplikasi. Jika Anda membuat link simbolis ke direktori library di direktori aplikasi, link tersebut akan diikuti dan library disertakan dalam aplikasi yang Anda deploy ke App Engine.

Jalur include modul Python menyertakan direktori root aplikasi Anda, yaitu direktori yang berisi file app.yaml. Modul Python yang Anda buat di direktori root aplikasi tersedia menggunakan jalur dari root. Jangan lupa untuk membuat file __init__.py yang diperlukan di sub-direktori Anda agar Python mengenali sub-direktori tersebut sebagai paket. Selain itu, pastikan library Anda tidak memerlukan ekstensi C.

Rangkaian pesan

Thread dapat dibuat di Python versi 2.7 menggunakan modul thread atau threading. Perhatikan bahwa thread akan digabungkan oleh runtime saat permintaan berakhir sehingga thread tidak dapat berjalan setelah akhir permintaan.

Thread latar belakang

Kode yang berjalan pada instance dengan penskalaan manual atau dasar dapat memulai thread latar belakang yang dapat aktif lebih lama dibandingkan permintaan yang menghasilkannya. Hal ini memungkinkan instance melakukan tugas berkala atau terjadwal arbitrer, atau terus bekerja di latar belakang setelah permintaan ditampilkan kepada pengguna.

os.environ thread latar belakang dan entri logging tidak bergantung pada thread yang menghasilkannya.

Anda harus mengimpor modul google.appengine.api.background_thread dari SDK untuk App Engine.

from google.appengine.api import background_thread

Class BackgroundThread sama seperti threading.Threadclass Python biasa, tetapi dapat "aktif lebih lama" dari permintaan yang menghasilkannya. Ada juga fungsi start_new_background_thread() yang membuat thread latar belakang dan memulainya:

# 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()
Jumlah maksimum thread latar belakang serentak yang dibuat oleh App Engine API adalah 10 per instance. (Batas ini tidak berlaku untuk thread Java reguler yang tidak terkait dengan App Engine API.)

Alat

SDK untuk App Engine mencakup alat untuk menguji aplikasi, mengupload file aplikasi, mengelola indeks Datastore, mendownload data log, dan mengupload data dalam jumlah besar ke Datastore singkat ini.

Server pengembangan menjalankan aplikasi Anda di komputer lokal untuk menguji aplikasi. Server akan menyimulasikan layanan Datastore dan pembatasan sandbox. Server pengembangan juga dapat membuat konfigurasi untuk indeks Datastore berdasarkan kueri yang dilakukan aplikasi selama pengujian.

Alat gcloud menangani semua interaksi command line dengan aplikasi Anda yang berjalan di App Engine. Anda menggunakan gcloud app deploy untuk mengupload aplikasi ke App Engine, atau untuk memperbarui file konfigurasi individual, seperti konfigurasi indeks Datastore, yang memungkinkan Anda membangun indeks baru sebelum men-deploy kode. Anda juga dapat melihat data log aplikasi sehingga dapat menganalisis performa aplikasi menggunakan alat Anda sendiri.

Konkurensi dan latensi

Latensi aplikasi Anda memiliki dampak terbesar pada jumlah instance yang diperlukan untuk melayani traffic Anda. Jika Anda memproses permintaan dengan cepat, satu instance dapat menangani banyak permintaan.

Instance thread tunggal dapat menangani satu permintaan serentak. Oleh karena itu, ada hubungan langsung antara latensi dan jumlah permintaan yang dapat ditangani pada instance per detik. Misalnya, latensi 10 md sama dengan 100 permintaan/detik/instance.

Instance multi-thread dapat menangani banyak permintaan serentak. Oleh karena itu, ada hubungan langsung antara CPU yang dipakai dan jumlah permintaan/detik.

Aplikasi Python versi 2.7 mendukung permintaan serentak, sehingga satu instance dapat menangani permintaan baru sambil menunggu permintaan lain selesai. Konkurensi secara signifikan mengurangi jumlah instance yang dibutuhkan aplikasi, tetapi Anda perlu mendesain aplikasi untuk multithreading.

Misalnya, jika instance B4 (sekitar 2,4 GHz) menggunakan 10 Mcycles/permintaan, Anda dapat memproses 240 permintaan/detik/instance. Jika menggunakan 100 Mcycles/permintaan, Anda dapat memproses 24 permintaan/detik/instance. Angka-angka ini merupakan kasus yang ideal namun cukup realistis dalam kaitannya dengan apa yang dapat Anda capai dalam instance.

Variabel lingkungan

Variabel lingkungan berikut ditetapkan oleh runtime:

Variabel lingkungan Deskripsi
GAE_APPLICATION ID aplikasi App Engine Anda. ID ini diawali dengan 'region code~' seperti 'e~' untuk aplikasi yang di-deploy di Eropa.
GAE_DEPLOYMENT_ID ID deployment saat ini.
GAE_ENV Lingkungan App Engine. Tetapkan ke standard.
GAE_INSTANCE ID instance tempat layanan Anda saat ini berjalan.
GAE_RUNTIME Runtime yang ditentukan dalam file app.yaml Anda.
GAE_SERVICE Nama layanan yang ditentukan dalam file app.yaml Anda. Jika tidak ada nama layanan yang ditentukan, nama akan ditetapkan ke default.
GAE_VERSION Label versi layanan Anda saat ini.
GOOGLE_CLOUD_PROJECT ID project Google Cloud yang terkait dengan aplikasi Anda.
PORT Port yang menerima permintaan HTTP.

Anda dapat menentukan variabel lingkungan tambahan dalam file app.yaml, tetapi nilai di atas tidak dapat diganti.