021-71053903 [email protected] پشتیبانی از شنبه تا چهارشنبه ساعت 9 الی 16

جنگو، Celery و Flower: ایجاد و مدیریت وظایف ناهمزمان

جنگو، Celery و Flower: ایجاد و مدیریت وظایف ناهمزمان

مقدمه

 

 

مقدمه ای بر وظایف Asynchronous در جنگو

اگر در حال خواندن این مطلب هستید، به احتمال زیاد با چارچوب جنگو آشنا هستید. اگر نمی توانید برخی از راهنمای مبتدیان ما برای برنامه های وب جنگو را بررسی کنید. در این پست، نحوه تنظیم وظایف پس زمینه ناهمزمان با استفاده از Celery، Redis و ابزار نظارتی به نام Flower با استفاده از چارچوب جنگو را مورد بحث قرار می دهیم. وظایف ناهمزمان نشان می دهد که چندین کار به صورت موازی پردازش می شوند در حالی که وظایف همزمان فقط یک به یک اجرا می شوند. Celery یک صف وظیفه است که در پایتون نوشته شده است که اجازه می دهد کار بین کارگران توزیع شود، بنابراین وظایف را قادر می سازد به صورت ناهمزمان اجرا شوند. با این حال، Celery به یک واسطه پیام نیاز دارد که به عنوان یک واسطه بین برنامه جنگو و صف وظایف Celery عمل کند. برای این آموزش، ما از Redis به عنوان واسطه پیام خود استفاده خواهیم کرد. در نهایت، برای مشاهده کارگران خود و دیدن کارهایی که انجام می دهیم، از Flower استفاده می کنیم. در زیر خلاصه ای از ویژگی های مختلف و وب سایت های رسمی برای هر نرم افزار را فهرست می کنیم.

 

ویژگی های کرفس

  • در دسترس بودن بالا
  • استفاده و نگهداری آسان
  • سریع – میلیون ها کار را می توان در یک دقیقه پردازش کرد
  • از چندین کارگزار پشتیبانی می کند: RabbitMQ، Redis، Amazon SQS و غیره
  • کارها را با استفاده از ماژول تاریخ پایتون زمان بندی کنید
  • اسناد رسمی:  https://docs.celeryproject.org/en/stable/index.html

 

ویژگی های Redis

  • از طیف گسترده ای از ساختارهای داده پشتیبانی می کند: رشته ها، هش ها، لیست ها، مجموعه ها، بیت مپ ها، نمایه های مکانی و بسیاری موارد دیگر
  • می تواند به عنوان پایگاه داده، حافظه پنهان و واسطه پیام استفاده شود
  • می تواند 512 مگابایت را در یک کلید و مقدار ذخیره کند
  • سیستم پیام رسانی Pub/Sub برای پیام رسانی با کارایی بالا
  • سرعت خواندن و نوشتن بالا
  • آموزش تعاملی برای درک اینکه Redis چگونه داده ها را ذخیره می کند:  https://try.redis.io/
  • اسناد رسمی:  https://redis.io/documentation

 

ویژگی های گل

  • نظارت در زمان واقعی با پیشرفت کار، زمان شروع، استدلال ها و آمار
  • کارگران Celery را از راه دور کنترل کنید – نمونه های کارگر را راه اندازی مجدد، لغو یا خاتمه دهید
  • کارگزار نظارت
  • داشبورد ساده و سرراست
  • اسناد رسمی: https://flower.readthedocs.io/en/latest/

پیش نمایش گل:

آموزش Django Celery Redis:

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

  • یک محیط مجازی ایجاد کنید، محیط را فعال کنید، جنگو را نصب کنید و یک پروژه راه اندازی کنید (توجه: دستورات زیر برای ویندوز 10 هستند)
C:\Users\Owner\Desktop\code>py -m venv celery-demo

C:\Users\Owner\Desktop\code>cd celery-demo

C:\Users\Owner\Desktop\code\celery-demo>ls
Include  Lib  Scripts  pyvenv.cfg

C:\Users\Owner\Desktop\code\celery-demo>Scripts\activate

(celery-demo) C:\Users\Owner\Desktop\code\celery-demo>pip install django

(celery-demo) C:\Users\Owner\Desktop\code\celery-demo>django-admin startproject mysite
  • دایرکتوری را به mysite تغییر دهید و Celery را با بروکر Redis نصب کنید. بدیهی است که در اینجا می توانید علاوه بر Redis از یک کارگزار متفاوت استفاده کنید
(celery-demo) C:\Users\Owner\Desktop\code\celery-demo\mysite>pip install "celery[redis]"
  • در پوشه mysite/mysite (با settings.py) یک فایل جدید به نام celery.py ایجاد کنید
  • ابتدا باید نمونه Celery را تعریف کنیم. در celery.py کد زیر را اضافه کنید:
import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

app = Celery('mysite', backend='redis', broker='redis://localhost:6379')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
  • بعد، ما به Celery نیاز داریم تا با شروع جنگو اجرا شود. در mysite/mysite/init.py موارد زیر را اضافه کنید:
from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)
  • در mysite/mysite/settings.py موارد زیر را اضافه کنید:
BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

INSTALLED_APPS = [
    # others app
    'celery',

]
  • اکنون باید یک وظیفه اضافه کنیم. برای انجام این کار، یک برنامه جنگو ایجاد می کنیم و سپس یک فایل جدید به نام tasks.py در برنامه ایجاد می کنیم. عملکرد قبلی app.autodiscover_tasks()در celery.py عبارت “tasks.py” را در تمام برنامه هایی که ایجاد می کنیم جستجو می کند، در این صورت، می توانید چندین برنامه ایجاد کنید که وظایف مختلف را تا زمانی که در یک فایل tasks.py ذخیره می شوند، انجام دهید.
(celery-demo) C:\Users\Owner\Desktop\code\celery-demo\mysite>py manage.py startapp main

توجه داشته باشید که همه وظایف باید از @shared_taskتگ استفاده کنند. tasks.py را در برنامه اصلی ایجاد کنید و وظیفه زیر را اضافه کنید:

#mysite/main/tasks.py

from __future__ import absolute_import
from celery import shared_task


@shared_task
def test(param):
    return 'The tasks executed with the following parameter: "%s" '

urls.py را در برنامه اصلی ایجاد کنید:

#mysite/main/urls.py

from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.home ),
]

یک نما اضافه کنید تا وظیفه جدید اضافه شده را به یک Slug متصل کنید. توجه کنید delayکه وقتی وظیفه را برای اجرای تابع در پس‌زمینه فراخوانی می‌کنیم، چگونه اضافه می‌کنیم.

#mysite/main/views.py

from django.shortcuts import render
from django.http import HttpResponse
from .tasks import test

# Create your views here.
def home(request):
  test.delay(15)
  return HttpResponse("Hey there!")
  • زمان نصب Redis:
    • در ویندوز، از آنجایی که Redis نسخه رسمی ندارد، از https://github.com/microsoftarchive/redis/releases دیدن کنید و آخرین نسخه را دانلود کنید.
      • فایل فشرده شده را در پوشه پروژه mysite استخراج کنید.
      • در خط فرمان، اجرا کنیدredis-server.exe
      • در یک خط فرمان جدید، به دایرکتوری پروژه بروید و اجرا کنیدredis-client.exe
      • “پینگ” را تایپ کنید و باید یک پاسخ “PONG” دریافت کنید
      • خط فرمان را ببندید
    • در مک، با خیال راحت از Homebrew استفاده کنید و دستورات زیر را در فهرست راهنمای mysite وارد کنید
      • brew install redis
      • سرور redis را در ترمینال اجرا کنید
      • در ترمینال جدید، به دایرکتوری پروژه بروید و اجرا کنید redis-client
      • “پینگ” را تایپ کنید و باید یک پاسخ “PONG” دریافت کنید
  • سرور Redis خود را در یک ترمینال/خط فرمان در حال اجرا نگه دارید، در دیگری، اجرای redis-client را متوقف کنید و دستور زیر را برای نصب گل وارد کنید.
    • پیپ نصب گل
  • اکنون، مطمئن شوید که 4 ترمینال/خط فرمان برای دستورات زیر دارید:
    • 1) برای اجرای سرور redis
    • 2) برای اجرا:py/python3 manage.py runserver
    • 3) برای دویدن کرفس:celery -A mysite worker -l info --pool=solo
    • 4) برای اجرای گل:flower -A mysite
  • پس از اجرای گل، آدرسی برای مشاهده داشبورد، در این مورد، در پورت 5555 مشاهده خواهید کرد
(celery-demo) C:\Users\Owner\Desktop\code\celery-demo\mysite>flower -A mysite
[I 200914 08:03:54 command:140] Visit me at http://localhost:5555
[I 200914 08:03:54 command:145] Broker: redis://localhost:6379//

برای اجرای وظیفه خود از http://127.0.0.1:8000/ دیدن کنید و سپس داشبورد Flower را دوباره مشاهده کنید

اگر داشبورد نشان می‌دهد که کار با موفقیت انجام شده است، باید بتوانید کار اجرا شده را در خط پایان/خط فرمانی که celery اجرا می‌کرد، مشاهده کنید:

[2020-09-21 12:12:23,328: INFO/MainProcess] Connected to redis://localhost:6379//
[2020-09-21 12:12:23,338: INFO/MainProcess] mingle: searching for neighbors
[2020-09-21 12:12:24,367: INFO/MainProcess] mingle: all alone
[2020-09-21 12:12:24,376: WARNING/MainProcess] c:\users\owner\desktop\code\celery-demo\lib\site-packages\celery\fixups\django.py:206: UserWarning: Using settings.DEBUG leads to a memory
            leak, never use this setting in production environments!
  leak, never use this setting in production environments!''')
[2020-09-21 12:12:24,377: INFO/MainProcess] [email protected] ready.
[2020-09-21 12:12:37,121: INFO/MainProcess] Events of group {task} enabled by remote.
[2020-09-21 12:12:40,825: INFO/MainProcess] Received task: main.tasks.test[4b88a8e4-9efa-4d7c-82ff-bfffa5969c4c]
[2020-09-21 12:12:40,829: INFO/MainProcess] Task main.tasks.test[4b88a8e4-9efa-4d7c-82ff-bfffa5969c4c] succeeded in 0.0s: 'The tasks executed with the following parameter:15'

نتیجه گیری: مزایای وظایف ناهمزمان

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

 

محمدرضا حسنی

224 مطلب منتشر شده

دانش آموخته رشته فناوری اطلاعات / موسس پایتونی ها

درباره این مطلب نظر دهید !

مطالب پرمخاطب پایتونی ها

آموزش تست نویسی در جنگو

تست نویسی در جنگو

11
دقیـقه مطالعه
ادامه ...

محصولات فروش پایتونی ها

%60
تخفیف

آموزش فیگما (Figma)

30,000 تومان
2