نحوه استفاده از App Engine Task Queue (کشش وظایف) در برنامه های Flask (ماژول 18)

1. بررسی اجمالی

مجموعه کدهای ایستگاه انتقال بدون سرور (آموزش‌های عملی) و ویدیوهای مرتبط با هدف کمک به توسعه‌دهندگان بدون سرور Google Cloud برای مدرن کردن برنامه‌های خود با هدایت آنها از طریق یک یا چند انتقال، عمدتاً از سرویس‌های قدیمی دور می‌شوند. انجام این کار برنامه های شما را قابل حمل تر می کند و گزینه ها و انعطاف پذیری بیشتری در اختیار شما قرار می دهد و به شما امکان می دهد با طیف وسیع تری از محصولات Cloud ادغام شده و به آنها دسترسی داشته باشید و راحت تر به نسخه های زبان جدیدتر ارتقا دهید. در حالی که در ابتدا بر روی اولین کاربران Cloud، عمدتاً توسعه دهندگان App Engine (محیط استاندارد) تمرکز می شود، این مجموعه به اندازه کافی گسترده است که شامل سایر پلتفرم های بدون سرور مانند Cloud Functions و Cloud Run یا در صورت وجود جاهای دیگر است.

این کد لبه به شما می آموزد که چگونه وظایف کششی App Engine Task Queue را در برنامه نمونه از ماژول 1 کد لبه قرار دهید و از آن استفاده کنید. ما استفاده از وظایف کششی را در این آموزش ماژول 18 اضافه می‌کنیم، سپس آن استفاده را به Cloud Pub/Sub در ماژول 19 منتقل می‌کنیم. کسانی که از Task Queues برای وظایف فشاری استفاده می‌کنند در عوض به Cloud Tasks مهاجرت می‌کنند و باید به ماژول‌های 7-9 مراجعه کنند.

شما یاد خواهید گرفت که چگونه

  • از App Engine Task Queue API/سرویس همراه استفاده کنید
  • استفاده از صف کشی را به یک برنامه پایه پایتون 2 Flask App Engine NDB اضافه کنید

آنچه شما نیاز دارید

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با پایتون چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

تجربه خود را در استفاده از خدمات Google Cloud چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

2. پس زمینه

به منظور انتقال از وظایف کششی App Engine Task Queue، استفاده از آن را به برنامه موجود Flask و App Engine NDB حاصل از کد ماژول 1 اضافه کنید. برنامه نمونه آخرین بازدیدهای کاربر نهایی را نشان می دهد. این خوب است، اما جالب تر است که بازدیدکنندگان را نیز ردیابی کنید تا ببینید چه کسی بیشتر بازدید می کند.

در حالی که می‌توانیم از وظایف فشار برای این تعداد بازدیدکننده استفاده کنیم، می‌خواهیم مسئولیت را بین برنامه نمونه‌ای تقسیم کنیم که وظیفه آن ثبت بازدیدها و پاسخگویی فوری به کاربران است، و یک «کارگر» تعیین‌شده که وظیفه آن محاسبه تعداد بازدیدکنندگان است. خارج از گردش کار نرمال درخواست-پاسخ.

برای پیاده‌سازی این طرح، استفاده از صف‌های کششی را به برنامه اصلی و همچنین پشتیبانی از عملکرد کارگر اضافه می‌کنیم. کارگر می‌تواند به‌عنوان یک فرآیند جداگانه (مانند یک نمونه پشتیبان یا کدی که روی یک ماشین مجازی که همیشه فعال است)، یک کار cron یا یک درخواست HTTP خط فرمان اولیه با استفاده از curl یا wget اجرا شود. پس از این ادغام، می‌توانید برنامه را به Cloud Pub/Sub در بخش کد بعدی (ماژول 19) منتقل کنید.

این آموزش شامل مراحل زیر است:

  1. راه اندازی/پیش کار
  2. پیکربندی را به روز کنید
  3. کد برنامه را تغییر دهید

3. راه اندازی/پیش کار

این بخش توضیح می دهد که چگونه:

  1. پروژه Cloud خود را راه اندازی کنید
  2. دریافت نمونه برنامه پایه
  3. (دوباره) استقرار و تأیید اعتبار برنامه پایه

این مراحل تضمین می کند که شما با کد کار شروع می کنید.

1. پروژه راه اندازی

اگر ماژول 1 را تکمیل کردید، از همان پروژه (و کد) دوباره استفاده کنید. از طرف دیگر، یک پروژه کاملاً جدید ایجاد کنید یا از پروژه موجود دیگری استفاده مجدد کنید. مطمئن شوید که پروژه دارای یک حساب صورتحساب فعال و یک برنامه App Engine فعال است. شناسه پروژه خود را پیدا کنید زیرا باید چندین بار آن را در این نرم افزار کد داشته باشید و هر زمان که با متغیر PROJECT_ID روبرو شدید از آن استفاده کنید.

2. برنامه نمونه پایه را دریافت کنید

یکی از پیش نیازهای این نرم افزار کد، داشتن یک اپلیکیشن موتور اپلیکیشن ماژول 1 است. ماژول 1 را کامل کنید (توصیه می شود) یا برنامه ماژول 1 را از مخزن کپی کنید. چه از ما استفاده کنید چه از کد ما، کد ماژول 1 جایی است که "شروع" می کنیم. این لبه کد شما را در هر مرحله راهنمایی می کند و با کدی که شبیه آنچه در پوشه مخزن ماژول 18 "FINISH" است، به پایان می رسد.

صرف نظر از اینکه از کدام برنامه ماژول 1 استفاده می کنید، پوشه باید مانند خروجی زیر باشد، احتمالاً با یک پوشه lib نیز:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3. (دوباره) استقرار برنامه پایه

مراحل زیر را برای استقرار برنامه ماژول 1 انجام دهید:

  1. در صورت وجود پوشه lib حذف کنید و اجرا کنید: pip install -t lib -r requirements.txt برای پر کردن مجدد lib اجرا کنید. اگر پایتون 2 و 3 را نصب کرده اید، ممکن است لازم باشد به جای آن از دستور pip2 استفاده کنید.
  2. مطمئن شوید که ابزار خط فرمان gcloud را نصب و راه اندازی کرده اید و استفاده از آن را بررسی کرده اید.
  3. اگر نمی‌خواهید با هر دستور gcloud صادر شده PROJECT_ID خود را وارد کنید، پروژه Cloud خود را با gcloud config set project PROJECT_ID تنظیم کنید.
  4. برنامه نمونه را با gcloud app deploy اجرا کنید
  5. تأیید کنید که برنامه ماژول 1 طبق انتظار اجرا می شود و آخرین بازدیدها را نمایش می دهد (تصویر زیر)

a7a9d2b80d706a2b.png

4. پیکربندی را به روز کنید

هیچ تغییری در فایل‌های پیکربندی استاندارد App Engine لازم نیست ( app.yaml ، requirements.txt ، appengine_config.py ). در عوض، یک فایل پیکربندی جدید به نام queue.yaml با محتویات زیر اضافه کنید و آن را در همان دایرکتوری سطح بالا قرار دهید:

queue:
- name: pullq
  mode: pull

فایل queue.yaml تمام صف‌های کاری را که برای برنامه شما وجود دارد مشخص می‌کند (به جز صف default [فشار] که به‌طور خودکار توسط App Engine ایجاد می‌شود). در این مورد، فقط یک صف وجود دارد، یک صف کشش به نام pullq . App Engine نیاز دارد که دستورالعمل mode به عنوان pull مشخص شود، در غیر این صورت به طور پیش فرض یک صف فشار ایجاد می کند. درباره ایجاد صف های کششی در مستندات بیشتر بیاموزید. همچنین برای سایر گزینه ها به صفحه مرجع queue.yaml مراجعه کنید.

این فایل را جدا از برنامه خود مستقر کنید. همچنان از gcloud app deploy استفاده می‌کنید، اما queue.yaml در خط فرمان نیز ارائه می‌کنید:

$ gcloud app deploy queue.yaml
Configurations to update:

descriptor:      [/tmp/mod18-gaepull/queue.yaml]
type:            [task queues]
target project:  [my-project]

WARNING: Caution: You are updating queue configuration. This will override any changes performed using 'gcloud tasks'. More details at
https://cloud.google.com/tasks/docs/queue-yaml

Do you want to continue (Y/n)?

Updating config [queue]...⠹WARNING: We are using the App Engine app location (us-central1) as the default location. Please use the "--location" flag if you want to use a different location.
Updating config [queue]...done.

Task queues have been updated.

Visit the Cloud Platform Console Task Queues page to view your queues and cron jobs.
$

5. کد برنامه را تغییر دهید

این بخش دارای به روز رسانی فایل های زیر است:

  • main.py - استفاده از صف های کششی را به برنامه اصلی اضافه کنید
  • templates/index.html — برای نمایش داده های جدید، الگوی وب را به روز کنید

واردات و ثابت

اولین مرحله اضافه کردن یک واردات جدید و چندین ثابت برای پشتیبانی از صف های کششی است:

  • یک واردات از کتابخانه Task Queue، google.appengine.api.taskqueue اضافه کنید.
  • سه ثابت را برای پشتیبانی از اجاره حداکثر تعداد کارهای کششی ( TASKS ) به مدت یک ساعت ( HOUR ) از صف کشش ما ( QUEUE ) اضافه کنید.
  • یک ثابت برای نمایش آخرین بازدیدها و همچنین بازدیدکنندگان برتر اضافه کنید ( LIMIT ).

در زیر کد اصلی و ظاهر آن پس از انجام این به روز رسانی ها آمده است:

قبل از:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

بعد از:

from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb

HOUR = 3600
LIMIT = 10
TASKS = 1000
QNAME = 'pullq'
QUEUE = taskqueue.Queue(QNAME)
app = Flask(__name__)

اضافه کردن یک کار کششی (جمع آوری داده ها برای کار و ایجاد کار در صف کشش)

مدل داده Visit مانند پرس و جو برای بازدیدها برای نمایش در fetch_visits() ثابت می ماند. تنها تغییر مورد نیاز در این قسمت از کد در store_visit() است. علاوه بر ثبت بازدید، یک کار با آدرس IP بازدیدکننده به صف کشش اضافه کنید تا کارگر بتواند شمارنده بازدیدکننده را افزایش دهد.

قبل از:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

بعد از:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit in Datastore and queue request to bump visitor count'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
    QUEUE.add(taskqueue.Task(payload=remote_addr, method='PULL'))

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

ایجاد مدل داده و عملکرد پرس و جو برای ردیابی بازدیدکنندگان

اضافه کردن یک مدل داده VisitorCount برای ردیابی بازدیدکنندگان. باید فیلدهایی برای خود visitor و همچنین یک counter عدد صحیح برای ردیابی تعداد بازدیدها داشته باشد. سپس یک تابع جدید (به طور متناوب، می تواند یک classmethod پایتون باشد) به نام fetch_counts() اضافه کنید تا بازدیدکنندگان برتر را به ترتیب بیشترین به حداقل برگردانید. کلاس و تابع را درست زیر بدنه fetch_visits() اضافه کنید:

class VisitorCount(ndb.Model):
    visitor = ndb.StringProperty(repeated=False, required=True)
    counter = ndb.IntegerProperty()

def fetch_counts(limit):
    'get top visitors'
    return VisitCount.query().order(-VisitCount.counter).fetch(limit)

کد کارگر را اضافه کنید

یک تابع جدید log_visitors() اضافه کنید تا بازدیدکنندگان را از طریق درخواست GET به /log وارد کنید. از یک فرهنگ لغت/هش برای ردیابی آخرین تعداد بازدیدکنندگان استفاده می کند و تا آنجا که ممکن است به مدت یک ساعت کارها را اجاره می کند. برای هر کار، تمام بازدیدهای یک بازدیدکننده را محاسبه می کند. با در دست داشتن آمار، برنامه تمام موجودیت های مربوطه VisitorCount را که قبلاً در Datastore هستند به روز می کند یا در صورت نیاز موارد جدید ایجاد می کند. آخرین مرحله یک پیام متنی ساده برمی گرداند که نشان می دهد چند بازدیدکننده از چند کار پردازش شده ثبت شده اند. این تابع را درست در زیر fetch_counts() به main.py اضافه کنید:

@app.route('/log')
def log_visitors():
    'worker processes recent visitor counts and updates them in Datastore'
    # tally recent visitor counts from queue then delete those tasks
    tallies = {}
    tasks = QUEUE.lease_tasks(HOUR, TASKS)
    for task in tasks:
        visitor = task.payload
        tallies[visitor] = tallies.get(visitor, 0) + 1
    if tasks:
        QUEUE.delete_tasks(tasks)

    # increment those counts in Datastore and return
    for visitor in tallies:
        counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
        if not counter:
            counter = VisitorCount(visitor=visitor, counter=0)
            counter.put()
        counter.counter += tallies[visitor]
        counter.put()
    return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
            len(tasks), len(tallies))

کنترل کننده اصلی را با داده های نمایشگر جدید به روز کنید

برای نمایش بازدیدکنندگان برتر، root() اصلی را برای فراخوانی fetch_counts() به روز کنید. علاوه بر این، الگو به روز می شود تا تعداد بازدیدکنندگان برتر و آخرین بازدیدها را نشان دهد. تعداد بازدیدکنندگان را به همراه آخرین بازدیدها از فراخوانی به fetch_visits() بسته بندی کنید و آن را در یک context واحد رها کنید تا به الگوی وب منتقل شود. کد قبل و بعد از انجام این تغییر در زیر آمده است:

قبل از:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

بعد از:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    context = {
        'limit':  LIMIT,
        'visits': fetch_visits(LIMIT),
        'counts': fetch_counts(LIMIT),
    }
    return render_template('index.html', **context)

اینها همه تغییرات مورد نیاز main.py هستند، و در اینجا یک نمایش تصویری از این به‌روزرسانی‌ها برای مقاصد گویا است تا به شما یک ایده کلی از تغییراتی که در main.py ایجاد می‌کنید ارائه دهد:

ad5fd3345efc13d0.png

الگوی وب را با داده های نمایشی جدید به روز کنید

قالب وب templates/index.html به یک به روز رسانی نیاز دارد تا بازدیدکنندگان برتر علاوه بر بار معمولی بیشتر بازدیدکنندگان اخیر نمایش داده شود. بازدیدکنندگان برتر و تعداد آنها را در جدولی در بالای صفحه رها کنید و به ارائه آخرین بازدیدها مانند قبل ادامه دهید. تنها تغییر دیگر این است که عدد نشان داده شده از طریق متغیر limit به جای کدگذاری سخت عدد مشخص کنید. در اینجا به روز رسانی هایی است که باید در قالب وب خود انجام دهید:

قبل از:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

بعد از:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>

<h3>Top {{ limit }} visitors</h3>
<table border=1 cellspacing=0 cellpadding=2>
    <tr><th>Visitor</th><th>Visits</th></tr>
{% for count in counts %}
    <tr><td>{{ count.visitor|e }}</td><td align="center">{{ count.counter }}</td></tr>
{% endfor %}
</table>

<h3>Last {{ limit }} visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

این تغییرات لازم را با اضافه کردن استفاده از وظایف کششی App Engine Task Queue به برنامه نمونه ماژول 1 به پایان می‌رساند. فهرست شما اکنون نشان دهنده برنامه نمونه ماژول 18 است و باید حاوی این فایل ها باشد:

$ ls
README.md               appengine_config.py     queue.yaml              templates
app.yaml                main.py                 requirements.txt

6. خلاصه/پاکسازی

این بخش با استقرار برنامه، این کد را جمع‌بندی می‌کند و تأیید می‌کند که آن‌طور که در نظر گرفته شده و در هر خروجی منعکس‌شده کار می‌کند. برای پردازش تعداد بازدیدکنندگان، کارگر را جداگانه اجرا کنید. پس از تأیید اعتبار برنامه، مراحل پاکسازی را انجام دهید و مراحل بعدی را در نظر بگیرید.

استقرار و تأیید برنامه

مطمئن شوید که قبلاً صف کشش خود را تنظیم کرده اید، همانطور که در نزدیکی بالای این کد لبه با gcloud app deploy queue.yaml انجام دادیم. اگر این کار تکمیل شده است و نمونه برنامه شما آماده است، برنامه خود را با gcloud app deploy اجرا کنید. خروجی باید با برنامه ماژول 1 یکسان باشد با این تفاوت که اکنون یک جدول "بازدیدکنندگان برتر" را در بالا نشان می دهد:

b667551dcbab1a09.png

در حالی که صفحه وب به روز شده، بازدیدکنندگان برتر و آخرین بازدیدها را نشان می دهد، بدانید که تعداد بازدیدکنندگان شامل این بازدید نمی شود . برنامه تعداد بازدیدکنندگان قبلی را نمایش می‌دهد در حالی که یک کار جدید را حذف می‌کند و تعداد این بازدیدکنندگان را در صف کشش افزایش می‌دهد، وظیفه‌ای که در انتظار پردازش است.

می‌توانید با فراخوانی /log به روش‌های مختلف این کار را اجرا کنید:

برای مثال، اگر curl برای ارسال درخواست GET به /log استفاده می‌کنید، با توجه به اینکه PROJECT_ID خود را ارائه کرده‌اید، خروجی شما به این شکل خواهد بود:

$ curl https://PROJECT_ID.appspot.com/log
DONE (with 1 task[s] logging 1 visitor[s])

سپس تعداد به روز شده در بازدید بعدی وب سایت منعکس خواهد شد. همین!

برای تکمیل این کد لبه برای افزودن استفاده از سرویس صف کشی App Engine Task Queue به برنامه نمونه با موفقیت به شما تبریک می‌گوییم. اکنون برای مهاجرت به Cloud Pub/Sub، Cloud NDB و Python 3 در ماژول 19 آماده است.

تمیز کردن

ژنرال

اگر فعلاً کارتان تمام شده است، توصیه می‌کنیم برنامه App Engine خود را غیرفعال کنید تا از پرداخت صورت‌حساب جلوگیری کنید. با این حال، اگر می‌خواهید بیشتر آزمایش یا آزمایش کنید، پلتفرم App Engine یک سهمیه رایگان دارد، و تا زمانی که از آن سطح استفاده تجاوز نکنید، هزینه‌ای از شما دریافت نمی‌شود. این برای محاسبه است، اما ممکن است هزینه‌هایی برای خدمات App Engine مربوطه نیز وجود داشته باشد، بنابراین صفحه قیمت آن را برای اطلاعات بیشتر بررسی کنید. اگر این انتقال شامل سایر سرویس‌های Cloud باشد، آن‌ها جداگانه صورت‌حساب می‌شوند. در هر صورت، در صورت وجود، بخش «ویژه این کد آزمایشگاه» را در زیر ببینید.

برای افشای کامل، استقرار در یک پلت فرم محاسباتی بدون سرور Google Cloud مانند App Engine هزینه‌های ساخت و ذخیره‌سازی جزئی را متحمل می‌شود. Cloud Build سهمیه رایگان خودش را دارد و Cloud Storage هم دارد. ذخیره سازی آن تصویر مقداری از آن سهمیه را مصرف می کند. با این حال، ممکن است در منطقه‌ای زندگی کنید که چنین سطح رایگانی ندارد، بنابراین برای به حداقل رساندن هزینه‌های احتمالی از میزان استفاده از فضای ذخیره‌سازی خود آگاه باشید. پوشه‌های خاص Cloud Storage که باید بررسی کنید عبارتند از:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • پیوندهای ذخیره سازی بالا به PROJECT_ID و * LOC * شما بستگی دارد، به عنوان مثال، اگر برنامه شما در ایالات متحده میزبانی می شود، " us ".

از سوی دیگر، اگر نمی‌خواهید با این برنامه یا دیگر کدهای مهاجرت مرتبط ادامه دهید و می‌خواهید همه چیز را به طور کامل حذف کنید، پروژه خود را خاموش کنید .

مخصوص این کد لبه

خدمات ذکر شده در زیر منحصر به این کد لبه هستند. برای اطلاعات بیشتر به مستندات هر محصول مراجعه کنید:

مراحل بعدی

در این «مهاجرت»، با افزودن پشتیبانی برای ردیابی بازدیدکنندگان، استفاده از صف فشار Task Queue را به برنامه نمونه ماژول 1 اضافه کردید و بدین ترتیب برنامه نمونه ماژول 18 را پیاده سازی کردید. در انتقال بعدی، وظایف کشش App Engine را به Cloud Pub/Sub ارتقا خواهید داد. از اواخر سال 2021، کاربران دیگر نیازی به مهاجرت به Cloud Pub/Sub در هنگام ارتقاء به Python 3 ندارند. اطلاعات بیشتر در مورد این موضوع را در بخش بعدی بخوانید.

برای مهاجرت به Cloud Pub/Sub، به ماژول 19 Codelab مراجعه کنید. فراتر از آن باید مهاجرت‌های دیگری را در نظر گرفت، مانند Cloud Datastore، Cloud Memorystore، Cloud Storage یا Cloud Tasks (صف‌های فشار). همچنین انتقال محصول متقابل به Cloud Run و Cloud Function وجود دارد. تمام محتوای ایستگاه مهاجرت بدون سرور (مجموعه‌های کد، ویدیوها، کد منبع [در صورت وجود]) را می‌توان در مخزن منبع باز آن مشاهده کرد.

7. مهاجرت به پایتون 3

در پاییز 2021، تیم App Engine پشتیبانی از بسیاری از سرویس‌های همراه را به زمان‌های اجرا نسل دوم (که دارای زمان اجرا نسل اول هستند) گسترش داد . در نتیجه، هنگام انتقال برنامه خود به پایتون 3، دیگر نیازی به مهاجرت از سرویس های همراه مانند App Engine Task Queue به Cloud مستقل یا سرویس های شخص ثالث مانند Cloud Pub/Sub ندارید. به عبارت دیگر، می توانید از Task Queue استفاده کنید. در برنامه‌های Python 3 App Engine تا زمانی که کد را برای دسترسی به سرویس‌های همراه از زمان‌های اجرا نسل بعدی، مجدداً اصلاح کنید.

می‌توانید در مورد نحوه انتقال استفاده از سرویس‌های همراه به پایتون 3 در کد ماژول 17 و ویدیوی مربوطه آن بیشتر بیاموزید. در حالی که این موضوع برای ماژول 18 خارج از محدوده است، پیوندهای زیر نسخه های پایتون 3 برنامه ماژول 1 است که به پایتون 3 منتقل شده و همچنان از App Engine NDB استفاده می کند. (در برخی موارد، یک نسخه پایتون 3 از برنامه ماژول 18 نیز در دسترس خواهد بود.)

8. منابع اضافی

فهرست زیر منابع اضافی برای توسعه دهندگانی است که این ماژول مهاجرت یا مربوط به آن و همچنین محصولات مرتبط را بررسی می کنند. این شامل مکان‌هایی برای ارائه بازخورد در مورد این محتوا، پیوندهایی به کد، و اسناد مختلفی است که ممکن است برایتان مفید باشد.

مسائل/بازخورد Codelab

اگر مشکلی با این کد لبه پیدا کردید، لطفاً قبل از تشکیل پرونده ابتدا مشکل خود را جستجو کنید. پیوندهایی برای جستجو و ایجاد مسائل جدید:

منابع مهاجرت

پیوندهای پوشه‌های مخزن برای ماژول 1 (START) و ماژول 18 (FINISH) را می‌توانید در جدول زیر بیابید. آنها همچنین می توانند از مخزن برای همه جابجایی های App Engine codelab قابل دسترسی باشند. آن را کلون کنید یا یک فایل ZIP دانلود کنید.

Codelab

پایتون 2

پایتون 3

ماژول 1

کد

کد (در این آموزش نشان داده نشده است)

ماژول 18 (این آزمایشگاه کد)

کد

N/A

مراجع آنلاین

در زیر منابع مرتبط با این آموزش آورده شده است:

صف وظایف موتور برنامه

پلت فرم App Engine

مستندات App Engine

زمان اجرا Python 2 App Engine (محیط استاندارد).

زمان اجرا Python 3 App Engine (محیط استاندارد).

تفاوت بین زمان اجرا Python 2 و 3 App Engine (محیط استاندارد).

راهنمای مهاجرت Python 2 به 3 App Engine (محیط استاندارد).

اطلاعات قیمت و سهمیه موتور App

راه اندازی پلتفرم App Engine نسل دوم (2018)

پشتیبانی طولانی مدت از زمان اجراهای قدیمی

نمونه های مهاجرت اسناد

سایر اطلاعات Cloud

ویدیوها

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.