🥷 کانال برنامه نویسی نینجا لرن | برای حرفه ای های وب و برنامه نویسان اینده 👨💻
🔥 چی منتظرته؟!
🌟 جامعهای برای رشد و یادگیری 🌟
تو هم عضوی از نینجاهای وب شو 😉
دسته بندی کانال 📚
🎯 | Channel : @NinjaLearn
💬 | Group : @NinjaLearnGap
➖➖➖➖➖➖➖➖➖➖
🔥 چی منتظرته؟!
🛠️ ابزارها و تکنولوژیهای کاربردی رو بشناس
🩺 نکات طلایی برنامهنویسی و مفاهیم کلیدی رو یاد بگیر
📬 تجربههای ناب و ترفندهای عملی رو کشف کن
🤝 با برنامهنویسان حرفهای مثل خودت شبکهسازی کن
🌟 جامعهای برای رشد و یادگیری 🌟
دسته بندی کانال 📚
🎯 | Channel : @NinjaLearn
💬 | Group : @NinjaLearnGap
➖➖➖➖➖➖➖➖➖➖
👍8
انواع دیتا تایپ ها در پایتون🐍
دیتا تایپ ها به نوع داده هایی که متغییر ها میتوانند نگه داری کنند میگن همچنین دیتا تایپ ها به مفسر یا کامپایلر میگن که چگونه با داده ها برخورد کنن
@ninja_learn_ir
دیتا تایپ ها به نوع داده هایی که متغییر ها میتوانند نگه داری کنند میگن همچنین دیتا تایپ ها به مفسر یا کامپایلر میگن که چگونه با داده ها برخورد کنن
@ninja_learn_ir
👍5
💣 بکگراند تسک در برنامهنویسی وب 💣
#پست_جدید
بکگراند تسکها یا وظایف پسزمینهای، عملیاتهایی هستن که خارج از پراسس یا ترد اصلی اجرای برنامه (main thread) اجرا میشن.
این عملیاتها به گونهای طراحی شدن که بدون تداخل در پاسخدهی برنامه به کاربرا، وظایف خاصی رو در پسزمینه انجام بدن. این کار به بهبود عملکرد و تجربه کاربری کمک میکنه.
❓چرا باید از بکگراند تسکها استفاده کنیم؟❓
1- بهبود کارایی و پاسخدهی:
اجرای عملیاتهای زمانبر (مثل پردازش دادهها، دانلود فایلهای بزرگ، ارسال پیامک و ارسال ایمیل) در بکگراند، از قفل شدن (freezing) رابط کاربری جلوگیری میکنه و باعث میشه که برنامه به طور مداوم پاسخگو بمونه.
2- مدیریت بهتر منابع:
توزیع وظایف بین ترد ها و پراسس های مختلف و یا استفاده از سرویسهای بکگراند، باعث میشه منابع سیستم بهتر مدیریت بشن و از افت کارایی جلوگیری میشه.
3- تجربه کاربری بهتر:
کاربرا انتظار دارن که برنامهها به سرعت واکنش نشون بدن. اجرای وظایف سنگین در پسزمینه باعث میشه کاربرا تجربهای روون تر و بدون وقفه داشته باشن.
❓ بکگراند تسکها برای چه کارهایی مناسب هستند؟ ❓
1- ارسال ایمیل، پیامک و نوتیفیکیشنها:
ارسال ایمیلها و پیامک های تأیید، نوتیفیکیشنها و سایر پیامهای سیستم به صورت همزمان با عملیات اصلی کاربر ممکنه زمانبر باشه. این کارها میتونن به عنوان بکگراند تسک انجام بشن.
2- پردازش فایلهای بزرگ:
پردازش فایلهای بزرگ مثل آپلود، دانلود و تبدیل فرمت فایلها میتونه در بکگراند انجام بشه تا برنامه به کاربرا پاسخگو بمونه.
3- بهروزرسانیهای دستهای:
بهروزرسانیهای انبوه دادهها در پایگاه داده، محاسبات پیچیده و تحلیل دادهها میتونه در بکگراند انجام بشه تا عملکرد برنامه تحت تأثیر قرار نگیره.
4- جمعآوری و تجزیه و تحلیل دادهها:
وظایف جمعآوری دادهها از منابع مختلف و تحلیلهای پیچیده میتونن به صورت دورهای در پسزمینه انجام بشن.
✅ نحوه استفاده از بکگراند تسکها ✅
1- استفاده از Job Queues:
صفهای کار (job queues) مثل Redis Queue، RabbitMQ، و Amazon SQS به شما اجازه میدن کارهای پسزمینهای تون رو مدیریت و اجرا کنید.
2- وب ورکر ها در مرورگر ها:
وب ورکر ها (Web Workers) به شما اجازه میدن اسکریپتهای جاوااسکریپت رو در پسزمینه اجرا کنید، بدون اینکه جریان اصلی برنامه تحت تأثیر قرار بگیره.
3- Task Scheduling:
ابزارها و فریمورکهایی مثل Celery برای Python و Sidekiq برای Ruby به شما اجازه میدن وظایف زمانبندی شده رو به صورت پسزمینهای اجرا کنید.
نمونه کد ساده با استفاده از Celery در Python:
#پست_جدید #جنگو #پایتون #بکگراند_تسک
@ninja_learn_ir
#پست_جدید
بکگراند تسکها یا وظایف پسزمینهای، عملیاتهایی هستن که خارج از پراسس یا ترد اصلی اجرای برنامه (main thread) اجرا میشن.
این عملیاتها به گونهای طراحی شدن که بدون تداخل در پاسخدهی برنامه به کاربرا، وظایف خاصی رو در پسزمینه انجام بدن. این کار به بهبود عملکرد و تجربه کاربری کمک میکنه.
❓چرا باید از بکگراند تسکها استفاده کنیم؟❓
1- بهبود کارایی و پاسخدهی:
اجرای عملیاتهای زمانبر (مثل پردازش دادهها، دانلود فایلهای بزرگ، ارسال پیامک و ارسال ایمیل) در بکگراند، از قفل شدن (freezing) رابط کاربری جلوگیری میکنه و باعث میشه که برنامه به طور مداوم پاسخگو بمونه.
2- مدیریت بهتر منابع:
توزیع وظایف بین ترد ها و پراسس های مختلف و یا استفاده از سرویسهای بکگراند، باعث میشه منابع سیستم بهتر مدیریت بشن و از افت کارایی جلوگیری میشه.
3- تجربه کاربری بهتر:
کاربرا انتظار دارن که برنامهها به سرعت واکنش نشون بدن. اجرای وظایف سنگین در پسزمینه باعث میشه کاربرا تجربهای روون تر و بدون وقفه داشته باشن.
❓ بکگراند تسکها برای چه کارهایی مناسب هستند؟ ❓
1- ارسال ایمیل، پیامک و نوتیفیکیشنها:
ارسال ایمیلها و پیامک های تأیید، نوتیفیکیشنها و سایر پیامهای سیستم به صورت همزمان با عملیات اصلی کاربر ممکنه زمانبر باشه. این کارها میتونن به عنوان بکگراند تسک انجام بشن.
2- پردازش فایلهای بزرگ:
پردازش فایلهای بزرگ مثل آپلود، دانلود و تبدیل فرمت فایلها میتونه در بکگراند انجام بشه تا برنامه به کاربرا پاسخگو بمونه.
3- بهروزرسانیهای دستهای:
بهروزرسانیهای انبوه دادهها در پایگاه داده، محاسبات پیچیده و تحلیل دادهها میتونه در بکگراند انجام بشه تا عملکرد برنامه تحت تأثیر قرار نگیره.
4- جمعآوری و تجزیه و تحلیل دادهها:
وظایف جمعآوری دادهها از منابع مختلف و تحلیلهای پیچیده میتونن به صورت دورهای در پسزمینه انجام بشن.
✅ نحوه استفاده از بکگراند تسکها ✅
1- استفاده از Job Queues:
صفهای کار (job queues) مثل Redis Queue، RabbitMQ، و Amazon SQS به شما اجازه میدن کارهای پسزمینهای تون رو مدیریت و اجرا کنید.
2- وب ورکر ها در مرورگر ها:
وب ورکر ها (Web Workers) به شما اجازه میدن اسکریپتهای جاوااسکریپت رو در پسزمینه اجرا کنید، بدون اینکه جریان اصلی برنامه تحت تأثیر قرار بگیره.
3- Task Scheduling:
ابزارها و فریمورکهایی مثل Celery برای Python و Sidekiq برای Ruby به شما اجازه میدن وظایف زمانبندی شده رو به صورت پسزمینهای اجرا کنید.
نمونه کد ساده با استفاده از Celery در Python:
# tasks.py
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def send_email(recipient):
# Logic for sending email
print(f'Sending email to {recipient}')
# main.py
from tasks import send_email
# Trigger the background task
send_email.delay('[email protected]')
#پست_جدید #جنگو #پایتون #بکگراند_تسک
@ninja_learn_ir
👍9
#پست_جدید
میخوام درمورد یک موضوع خیلی جالب توی جنگو صحبت کنم که اکثرا توش مشکل دارن
خب اون چیه؟
🤓 کش شدن نتیجه کوری ها❗️
میدونستید که جنگو نتیجه کوری هارو کش میکنه؟
حالا این یعنی چی ⁉️
یعنی جنگو فقط یک بار دیتابیس رو هیت میکنه و دیتا رو میگیره و همونو کش میکنه و از دفعه های بعدی تا زمان پایان اجرای تابع فعلی از اون نتیجه کش شده استفاده میکنه
حالا بیاید توضیح بدم.
⭕️ قبلش یه نکته مهم رو بگم: ⭕️
هر چیزی که باعث ایجاد یک QuerySet جدید بشه باعث هیت شدن جدید به دیتابیس خواهد شد.
حالا بریم مثالو ببینیم:
خب تو این کد بنظرتون چند بار دیتابیس توسط جنگو هیت وصدا زده میشه میشه؟
حتما فکرمیکنید ۳ بار نه اینجوری نیست ❗️
اینجا فقط 2 بار داره به دیتابیس هیت میزنه.
1️⃣ توی خط اول ما فقط queryset رو تعریف کردیم. از اونجایی که میدونید کوری ست ها توی جنگو lazy هستن و تا وقتی که صداشون نزنیم اجرا نمیشن.
2️⃣ توی خط دوم ما queryset رو print کردیم و اولین هیتمون به دیتابیس زده میشه ولی یه نکته print نمیره کل رکورد هارو بیاره چون منطقی نیست.
پرینت یک محدودیت داره برای آوردن رکورد ها مثلا اگه شما هزار تا رکورد داشته باشید print کل اون هزار تا رو نمیاره و مثلا ۱۰۰ تاشو میاره دومین نکته اینه که اینجا هیچ کشی اتفاق نمی افته( دلیلشو جلوتر میگم)
3️⃣ توی خط سوم ما میخوایم با if بررسی کنیم کاربری وجود داره یا نه اینجا جنگو میاد کش ر و چک میکنه تا ببینه برای users ریزالتی کش شده یانه
اینجا میبینه هیچ کشی وجود نداره و در نتیجه اینجا دومین هیتمون به دیتابیس میخوره و کل رکورد هارو برمیگردونه و مثل print عمل نمیکنه و نکته بعدی اینه اینجا ریزالت کوری توی رم سرور توسط جنگو کش میشه حالا اینجا جالب میشه😁
توی خط بعدی که یه حلقه زدیم روی users اینجا میاد کش رو چک میکنه و میبینه که ریزالت users کش شده و میاد از اون کش استفاده میکنه و به دیتابیس هیچ کوری نمیزنه و درنتیجه اینجا فقط دوبار به دیتابیس هیت خورده میشه
❓حالا چرا print نتیجش کش نشد؟ ❓
به گفته خود جنگو، جنگو فقط زمانی ریزالت یه queryset رو کش میکنه که اون queryset کامل اجرا بشه. و توی print چون queryset کامل اجرا نمیشه منطقا ریزالتش کش نمیشه
ولی توی if چون queryset کامل اجرا شد ریزالتشم کش شد
برای اثبات این حرفم میتونید چیزایی که کش شده رو ببینید 👇
خروجی این کد هم این خواهد بود:
همونطور که میبینید بعد از اجرا شدن print هیچ ریزالتی کش نشده و کش خالیه چون queryset کامل اجرا نشد.
ولی وقتی if اجرا شد چون queryset کامل اجرا شد ریزالتم کش شد و ازاین به بعد از کش استفاده میکنه.
یه نکته در پایان بگم این کش تا زمانی باقی میمونه که اجرای تابع تموم شه و بعد ازاون توسط garbage collector از مموری سرور پاک میشه جنگو توسط پایتون و پایتون روی سرور اجرا میشه.
توی پستای بعدی درمورد garbage collector بیشتر توضیح میدم
#جنگو #کش_در_جنگو #برنامه_نویسی
@ninja_learn_ir
میخوام درمورد یک موضوع خیلی جالب توی جنگو صحبت کنم که اکثرا توش مشکل دارن
خب اون چیه؟
🤓 کش شدن نتیجه کوری ها❗️
میدونستید که جنگو نتیجه کوری هارو کش میکنه؟
حالا این یعنی چی ⁉️
یعنی جنگو فقط یک بار دیتابیس رو هیت میکنه و دیتا رو میگیره و همونو کش میکنه و از دفعه های بعدی تا زمان پایان اجرای تابع فعلی از اون نتیجه کش شده استفاده میکنه
حالا بیاید توضیح بدم.
⭕️ قبلش یه نکته مهم رو بگم: ⭕️
هر چیزی که باعث ایجاد یک QuerySet جدید بشه باعث هیت شدن جدید به دیتابیس خواهد شد.
حالا بریم مثالو ببینیم:
users = User.objects.all()
print(users)
if users:
for u in users:
print(u)
خب تو این کد بنظرتون چند بار دیتابیس توسط جنگو هیت وصدا زده میشه میشه؟
حتما فکرمیکنید ۳ بار نه اینجوری نیست ❗️
اینجا فقط 2 بار داره به دیتابیس هیت میزنه.
1️⃣ توی خط اول ما فقط queryset رو تعریف کردیم. از اونجایی که میدونید کوری ست ها توی جنگو lazy هستن و تا وقتی که صداشون نزنیم اجرا نمیشن.
2️⃣ توی خط دوم ما queryset رو print کردیم و اولین هیتمون به دیتابیس زده میشه ولی یه نکته print نمیره کل رکورد هارو بیاره چون منطقی نیست.
پرینت یک محدودیت داره برای آوردن رکورد ها مثلا اگه شما هزار تا رکورد داشته باشید print کل اون هزار تا رو نمیاره و مثلا ۱۰۰ تاشو میاره دومین نکته اینه که اینجا هیچ کشی اتفاق نمی افته( دلیلشو جلوتر میگم)
3️⃣ توی خط سوم ما میخوایم با if بررسی کنیم کاربری وجود داره یا نه اینجا جنگو میاد کش ر و چک میکنه تا ببینه برای users ریزالتی کش شده یانه
اینجا میبینه هیچ کشی وجود نداره و در نتیجه اینجا دومین هیتمون به دیتابیس میخوره و کل رکورد هارو برمیگردونه و مثل print عمل نمیکنه و نکته بعدی اینه اینجا ریزالت کوری توی رم سرور توسط جنگو کش میشه حالا اینجا جالب میشه😁
توی خط بعدی که یه حلقه زدیم روی users اینجا میاد کش رو چک میکنه و میبینه که ریزالت users کش شده و میاد از اون کش استفاده میکنه و به دیتابیس هیچ کوری نمیزنه و درنتیجه اینجا فقط دوبار به دیتابیس هیت خورده میشه
❓حالا چرا print نتیجش کش نشد؟ ❓
به گفته خود جنگو، جنگو فقط زمانی ریزالت یه queryset رو کش میکنه که اون queryset کامل اجرا بشه. و توی print چون queryset کامل اجرا نمیشه منطقا ریزالتش کش نمیشه
ولی توی if چون queryset کامل اجرا شد ریزالتشم کش شد
برای اثبات این حرفم میتونید چیزایی که کش شده رو ببینید 👇
users = User.objects.all()
print(users)
print("Cache: ", users._result_cache)
if users:
print("Cache: ", users._result_cache)
for u in users:
print(u)
خروجی این کد هم این خواهد بود:
<QuerySet [<User: mohammad>]>
Cache: None
Cache: [<User: mohammad>]
mohammad
همونطور که میبینید بعد از اجرا شدن print هیچ ریزالتی کش نشده و کش خالیه چون queryset کامل اجرا نشد.
ولی وقتی if اجرا شد چون queryset کامل اجرا شد ریزالتم کش شد و ازاین به بعد از کش استفاده میکنه.
یه نکته در پایان بگم این کش تا زمانی باقی میمونه که اجرای تابع تموم شه و بعد ازاون توسط garbage collector از مموری سرور پاک میشه جنگو توسط پایتون و پایتون روی سرور اجرا میشه.
توی پستای بعدی درمورد garbage collector بیشتر توضیح میدم
#جنگو #کش_در_جنگو #برنامه_نویسی
@ninja_learn_ir
👍8❤2
Ninja Learn | نینجا لرن
💣 بکگراند تسک در برنامهنویسی وب 💣 #پست_جدید بکگراند تسکها یا وظایف پسزمینهای، عملیاتهایی هستن که خارج از پراسس یا ترد اصلی اجرای برنامه (main thread) اجرا میشن. این عملیاتها به گونهای طراحی شدن که بدون تداخل در پاسخدهی برنامه به کاربرا، وظایف خاصی…
🥦 چطوری با Celery در جنگو یک بک گراند تسک ایجاد کنیم؟ 🥦
خب حالا که با بکگراند تسک ها آشنا شدیم و میدونیم چی هستن و به چه درد میخورن و چه مزایایی دارن، بیاید ببینیم چطوری توی جنگو میتونیم یک بک گراند تسک با سلری ایجاد کنیم.
❓سلری (Celery) چیه؟❓
سلری یک سیستم صفبندی توزیع شده هست که برای مدیریت و اجرای وظایف پسزمینهای (background tasks) و وظایف زمانبندی شده (scheduled tasks) استفاده میشه. Celery در تعداد زیادی از پروژههای پایتونی برای بهبود کارایی و مدیریت وظایف استفاده میشه.
سلری یک سیستم توزیع شده، ساده، منعطف و قابل اعتماد برای پردازش مقدار زیادی پیام هست.
منظور از پیام در واقع تسک هایی هستن که از طریق یک مسیج بروکر مثل Redis یا RabbitMQ به همراه اطلاعات لازم و ضروری به ورکر های سلری که بکگراند تسک ها رو پردازش میکنن و انجام میدن تحویل داده میشن
سلری یک صف کار (Job Queue) با تمرکز روی پردازش زمان واقعیه در حالی که از زمانبندی کار (Task Scheduling) هم پشتیبانی میکنه.
سلری منبع باز (اوپن سورس) هست و تحت مجوز BSD مجوز داره.
✅ ایجاد یک بکگراند تسک با سلری ✅
1️⃣ نصب ردیس و Celery:
خب قدم اول اینه که celery رو به همراه redis نصب کنیم، ترمینال یا همون کامند پرامپت رو باز کنید و این دستور رو برای نصب سلری به همراه درایور Redis وارد کنید:
حالا که سلری رو به همراه درایور ردیس نصب کردید باید خود ردیس هم نصب کنید که من پیشنهاد میکنم برای این منظور از داکر استفاده کنید.
⭕️ اگه داکر رو نصب نکردید به آدرس: https://www.docker.com/ برید و داکر رو روی سیستم خودتون نصب کنید. ⭕️
بعد نصب داکر این دستور رو در ترمینال یا کامند پرامپت برای نصب و اجرای ردیس بزنید:
حالا که ردیس رو نصب و اجرا کردیم و سلری و درایور ردیس هم نصبه میتونیم بریم قدم بعدی ✅
2️⃣ ستاپ کردن سلری روی پروژه جنگویی
فرض رو بر این میگیرم که یه پروژه جنگویی ایجاد کردید و آماده دارید.
برای استفاده از Celery با پروژه جنگویی، اولش باید یک نمونه (Instance) از کتابخانه Celery (به اسم "app") تعریف کنید.
اگه ساختار یک پروژه مدرن جنگویی مثل این دارید:
- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py
⭕️ توجه کنید که اسم پروژه توی این مثال proj هست ⭕️
پس راه پیشنهادی ایجاد یک ماژول proj/proj/celery.py جدید هست که نمونه Celery رو تعریف می کنه:
فایل proj/proj/celery.py:
بعد باید این برنامه رو در ماژول proj/proj/__init__.py خودتون ایمپورت کنید. این تضمین میکنه که هنگام شروع و بالا اومدن جنگو، برنامه بارگیری میشه تا دکوریتور shared_task@ ازش استفاده کنه:
فایل proj/proj/__init__.py:
❓ بیایین ببینیم که در ماژول اول اتفاق می افته؟ ❓
ابتدا متغیر محیطی پیش فرض DJANGO_SETTINGS_MODULE رو برای برنامه خط فرمان celery (CLI) تنظیم می کنیم:
شما به این خط نیاز ندارین، اما شما رو از پاس دادن همیشگی ماژول تنظیمات جنگو به برنامه (app) سلری نجات می ده.
⭕️ همیشه باید قبل از ایجاد نمونه های برنامه سلری نوشته بشه ⭕️
همانطور که در ادامه انجام می دهیم:
این نمونهای از کتابخانه ما هست، شما میتونید نمونههای زیادی داشته باشید، اما احتمالاً دلیلی براش موقع استفاده از جنگو وجود نداره.
ما همچنین ماژول تنظیمات جنگو رو به عنوان منبع پیکربندی برای Celery اضافه می کنیم. این به این معنی هست که شما مجبور نیستین از چندین فایل پیکربندی استفاده کنید، و در عوض Celery رو مستقیماً از تنظیمات جنگو پیکربندی کنید. اما در صورت تمایل می تونید اون ها را جدا کنید.
نوشتن CELERY با حروف بزرگ به این معنی هست که همه گزینههای پیکربندی Celery باید به جای حروف کوچیک با حروف بزرگ مشخص بشن و با CELERY_ شروع بشن، بنابراین مثلا، تنظیمات task_always_eager به CELERY_TASK_ALWAYS_EAGER تبدیل میشه و متغیر broker_url به CELERY_URL_BROKER تبدیل میشه. این در مورد تنظیمات worker ها نیز صدق می کنه، مثلا، متغیر worker_concurrency به CELERY_WORKER_CONCURRENCY تبدیل میشه.
خب حالا که با بکگراند تسک ها آشنا شدیم و میدونیم چی هستن و به چه درد میخورن و چه مزایایی دارن، بیاید ببینیم چطوری توی جنگو میتونیم یک بک گراند تسک با سلری ایجاد کنیم.
❓سلری (Celery) چیه؟❓
سلری یک سیستم صفبندی توزیع شده هست که برای مدیریت و اجرای وظایف پسزمینهای (background tasks) و وظایف زمانبندی شده (scheduled tasks) استفاده میشه. Celery در تعداد زیادی از پروژههای پایتونی برای بهبود کارایی و مدیریت وظایف استفاده میشه.
سلری یک سیستم توزیع شده، ساده، منعطف و قابل اعتماد برای پردازش مقدار زیادی پیام هست.
منظور از پیام در واقع تسک هایی هستن که از طریق یک مسیج بروکر مثل Redis یا RabbitMQ به همراه اطلاعات لازم و ضروری به ورکر های سلری که بکگراند تسک ها رو پردازش میکنن و انجام میدن تحویل داده میشن
سلری یک صف کار (Job Queue) با تمرکز روی پردازش زمان واقعیه در حالی که از زمانبندی کار (Task Scheduling) هم پشتیبانی میکنه.
سلری منبع باز (اوپن سورس) هست و تحت مجوز BSD مجوز داره.
✅ ایجاد یک بکگراند تسک با سلری ✅
1️⃣ نصب ردیس و Celery:
خب قدم اول اینه که celery رو به همراه redis نصب کنیم، ترمینال یا همون کامند پرامپت رو باز کنید و این دستور رو برای نصب سلری به همراه درایور Redis وارد کنید:
pip install celery[redis]
حالا که سلری رو به همراه درایور ردیس نصب کردید باید خود ردیس هم نصب کنید که من پیشنهاد میکنم برای این منظور از داکر استفاده کنید.
⭕️ اگه داکر رو نصب نکردید به آدرس: https://www.docker.com/ برید و داکر رو روی سیستم خودتون نصب کنید. ⭕️
بعد نصب داکر این دستور رو در ترمینال یا کامند پرامپت برای نصب و اجرای ردیس بزنید:
docker run --name some-redis -d redis
حالا که ردیس رو نصب و اجرا کردیم و سلری و درایور ردیس هم نصبه میتونیم بریم قدم بعدی ✅
2️⃣ ستاپ کردن سلری روی پروژه جنگویی
فرض رو بر این میگیرم که یه پروژه جنگویی ایجاد کردید و آماده دارید.
برای استفاده از Celery با پروژه جنگویی، اولش باید یک نمونه (Instance) از کتابخانه Celery (به اسم "app") تعریف کنید.
اگه ساختار یک پروژه مدرن جنگویی مثل این دارید:
- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py
⭕️ توجه کنید که اسم پروژه توی این مثال proj هست ⭕️
پس راه پیشنهادی ایجاد یک ماژول proj/proj/celery.py جدید هست که نمونه Celery رو تعریف می کنه:
فایل proj/proj/celery.py:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True, ignore_result=True)
def debug_task(self):
print(f'Request: {self.request!r}')
بعد باید این برنامه رو در ماژول proj/proj/__init__.py خودتون ایمپورت کنید. این تضمین میکنه که هنگام شروع و بالا اومدن جنگو، برنامه بارگیری میشه تا دکوریتور shared_task@ ازش استفاده کنه:
فایل proj/proj/__init__.py:
from .celery import app as celery_app
__all__ = ('celery_app',)
❓ بیایین ببینیم که در ماژول اول اتفاق می افته؟ ❓
ابتدا متغیر محیطی پیش فرض DJANGO_SETTINGS_MODULE رو برای برنامه خط فرمان celery (CLI) تنظیم می کنیم:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
شما به این خط نیاز ندارین، اما شما رو از پاس دادن همیشگی ماژول تنظیمات جنگو به برنامه (app) سلری نجات می ده.
⭕️ همیشه باید قبل از ایجاد نمونه های برنامه سلری نوشته بشه ⭕️
همانطور که در ادامه انجام می دهیم:
app = Celery('proj')
این نمونهای از کتابخانه ما هست، شما میتونید نمونههای زیادی داشته باشید، اما احتمالاً دلیلی براش موقع استفاده از جنگو وجود نداره.
ما همچنین ماژول تنظیمات جنگو رو به عنوان منبع پیکربندی برای Celery اضافه می کنیم. این به این معنی هست که شما مجبور نیستین از چندین فایل پیکربندی استفاده کنید، و در عوض Celery رو مستقیماً از تنظیمات جنگو پیکربندی کنید. اما در صورت تمایل می تونید اون ها را جدا کنید.
app.config_from_object('django.conf:settings', namespace='CELERY')
نوشتن CELERY با حروف بزرگ به این معنی هست که همه گزینههای پیکربندی Celery باید به جای حروف کوچیک با حروف بزرگ مشخص بشن و با CELERY_ شروع بشن، بنابراین مثلا، تنظیمات task_always_eager به CELERY_TASK_ALWAYS_EAGER تبدیل میشه و متغیر broker_url به CELERY_URL_BROKER تبدیل میشه. این در مورد تنظیمات worker ها نیز صدق می کنه، مثلا، متغیر worker_concurrency به CELERY_WORKER_CONCURRENCY تبدیل میشه.
👍11