Dev Perfects
40 subscribers
9.23K photos
1.26K videos
468 files
13K links
بخوام خیلی خلاصه بگم
این کانال میاد مطالب کانالای خفن تو حوزه تکنولوژی و برنامه نویسی رو جمع میکنه

پست پین رو بخونید
https://t.iss.one/dev_perfects/455


ارتباط:
https://t.iss.one/HidenChat_Bot?start=936082426
Download Telegram
🌳 همه‌چی درباره B-Tree توی دیتابیس‌های رابطه‌ای 🌳

امروز می‌خوایم درباره B-Tree توی دیتابیس‌های رابطه‌ای صحبت کنیم. اگه تا حالا با دیتابیس‌های مثل MySQL یا PostgreSQL کار کرده باشی، احتمالاً اسم B-Tree به گوشت خورده. B-Tree یکی از مهم‌ترین ساختارهای داده توی دیتابیس‌هاست که برای ایندکس کردن و جستجوی سریع داده‌ها استفاده میشه 📈.

حالا B-Tree چیه؟ 🌳

خب B-Tree یه ساختار درختی (tree structure) هست که توی ایندکس‌های دیتابیس استفاده میشه. این درخت به‌صورت بالانس طراحی شده، یعنی همه شاخه‌ها از ریشه تا برگ‌ها تقریباً به یه اندازه طول دارن. این باعث میشه عملیات جستجو، درج، حذف و به‌روزرسانی داده‌ها با سرعت بالایی انجام بشه 🚀.

توی B-Tree، هر گره (node) می‌تونه چندین کلید (key) و فرزند (child) داشته باشه. این یعنی برخلاف درخت‌های دودویی معمولی که هر گره فقط ۲ فرزند داره، توی B-Tree هر گره می‌تونه چند فرزند و کلید داشته باشه. این باعث میشه که عمق درخت کم بشه و دسترسی به داده‌ها سریع‌تر باشه.

چرا B-Tree توی دیتابیس‌ها استفاده میشه؟ 🤔

1⃣ سرعت بالای جستجو 🔍 
   یکی از مزیت‌های بزرگ B-Tree اینه که جستجو توی اون خیلی سریع انجام میشه. چون این درخت به‌صورت متوازن طراحی شده، عمق زیادی نداره و سریع میشه به داده‌ها رسید.

2⃣ مناسب برای عملیات درج و حذف  
 خب B-Tree نه‌تنها برای جستجو عالیه، بلکه برای درج و حذف داده‌ها هم خیلی بهینه است. وقتی یه داده جدید رو وارد می‌کنی یا داده‌ای رو حذف می‌کنی، درخت همچنان بالانس خودش رو حفظ می‌کنه و کارایی رو پایین نمیاره.

3. مقیاس‌پذیری 📏 
   دیتابیس‌هایی مثل MySQL و PostgreSQL برای اینکه بتونن حجم زیادی از داده‌ها رو مدیریت کنن، از B-Tree استفاده می‌کنن. این ساختار داده به‌خاطر توانایی مدیریت تعداد زیادی از کلیدها و گره‌ها، مقیاس‌پذیری خوبی داره.

چطوری B-Tree کار می‌کنه؟ ⚙️

فرض کن یه جدول توی دیتابیس داری که می‌خوای ازش به‌سرعت داده‌هایی رو پیدا کنی. اگه این جدول بزرگ باشه، جستجوی خطی خیلی طول می‌کشه. اینجاست که ایندکس به کمک میاد! وقتی یه ایندکس می‌سازی، دیتابیس از B-Tree برای ذخیره کردن اون ایندکس استفاده می‌کنه.

مثلاً اگه یه کوئری مثل این داشته باشی:

SELECT * FROM users WHERE id = 123;

اگه روی ستون id ایندکس ساخته باشی، دیتابیس از B-Tree برای پیدا کردن رکورد مورد نظر استفاده می‌کنه و این کار خیلی سریع انجام میشه.

تفاوت B-Tree و B+Tree چیه؟ 🤨

خیلی از دیتابیس‌های مدرن از نسخه‌ای به نام B+Tree استفاده می‌کنن. فرق B+Tree اینه که همه داده‌ها فقط توی برگ‌ها (leaf nodes) ذخیره میشن و گره‌های میانی فقط برای جستجو استفاده میشن. این باعث میشه که دسترسی به داده‌ها سریع‌تر بشه، چون برگ‌ها به‌صورت مرتب ذخیره شدن و به‌راحتی میشه بین اون‌ها پیمایش کرد.

چطوری ایندکس B-Tree بسازیم؟ 🛠️

ساختن ایندکس B-Tree توی دیتابیس خیلی ساده است. مثلاً توی MySQL می‌تونی اینجوری یه ایندکس روی ستون id بسازی:

CREATE INDEX idx_id ON users (id);


با این کار، دیتابیس یه index برای ستون id می‌سازه و از این به بعد جستجوها خیلی سریع‌تر میشن.

جمع‌بندی 🎯

فهمیدیم B-Tree یه ساختار داده عالی برای مدیریت ایندکس‌ها توی دیتابیس‌های رابطه‌ایه. سرعت بالای جستجو، درج و حذف داده‌ها، و مقیاس‌پذیری بالا از ویژگی‌های خوبشه. با اینکه B-Tree یه ساختار پیچیده‌ست، ولی خیلی از دیتابیس‌های معروف مثل MySQL و PostgreSQL از اون استفاده می‌کنن تا کارایی کوئری‌ها رو بهینه کنن.

امیدوارم مفید بوده باشه :)

#db #btree #bptree


@ninja_learn_ir
Forwarded from Geek Alerts
سامسونگ میخواد با همکاری TSMC یک کارخونه تولید تراشه داخل امارات تاسیس کنه، این پروژه ۱۰۰ میلیارد دلاری سرمایه‌گذارش صندوق Mubadala ابوظبی هست و شامل همون پروژه MGX میشه که میخواد امارات رو به یکی از مراکز هوش‌مصنوعی و تراشه تبدیل کنه، با OpenAI هم همکاری دارن.
ولی از یه طرف اینا چون تکنولوژی های‌تک حساب میشن هر کشوری مثل امارات و ... نمیتونه تولید تراشه داشته باشه.
برای حل این موضوع امارات و سامسونگ اومدن پیشنهاد دادن که آمریکا بر روند تولید و فروش تراشه‌ها نظارت داشته باشه.
سخنگوی امنیت ملی آمریکا هم گفتن تو مسیر درستی برای این همکاری هستیم که یعنی منظورشون ساخته شدن قطعی کارخانه تولید تراشه در امارات هست.
اینا البته جدال بین غرب و شرق هم میشه، آمریکا با این شرط به کشورهای عربی اجازه میده وارد تکنولوژی‌های پیشرفته بشن که در واقع سمت غرب باشن. «نقطه مقابل چین هست»
the-decoder
@geekalerts
Forwarded from Geek Alerts
توی زندان‌ها متداول هست که از زندانی‌ها توی کارهای مثل خیاطی، نظافت و ... استفاده میکنن.
الان توی فنلاند اومدن به کمک یه استارتاپ به اسم Metroc از زندانی‌ها برای کارهای مرتبط با هوش‌مصنوعی استفاده میکنن.
اینجوری که اول یه دوره آموزشی هوش‌مصنوعی برای زندانی‌ها میذارن، به هر کدوم یک لپ‌تاپ میدن و بعد زندانی‌ها توی تمرین دادن هوش‌مصنوعی کمک میکنن.
هم حقوق دریافت میکنن و هم زمان آزادی یک تخصص برای کار کردن دارن که سمت خلاف نرن.
میگن انقدر کار خاصی بوده که کشورهای دیگه ازشون درخواست کردن برای اجراش بهشون مشاوره بدن.
euronews
@geekalerts
Forwarded from Syntax | سینتکس (𝙰𝚖𝚒𝚛𝚑𝚘𝚜𝚜𝚎𝚒𝚗)
Django Serializers: Related Fields in Serializer


وقتی با مدل‌های مرتبط در Django کار می‌کنیم، نمایش اطلاعات کامل آن‌ها در سریالایزرها می‌تواند چالش‌برانگیز باشد. خوشبختانه، Django REST Framework (DRF) ابزارهای قدرتمندی برای این کار در اختیار ما قرار می‌دهد.

سریالایزر DRF به‌طور پیش‌فرض برای فیلدهای مرتبط در هنگام سریال‌سازی داده‌ها از مقدار primary key استفاده می‌کند. به عنوان مثال:

class Author(models.Model):
name = models.CharField()
last_name = models.CharField()

class Blog(models.Model):
title = models.CharField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)

class BlogSerializer(serializers.ModelSerializer):
class Meta:
model = Blog
fields = "__all__"


خروجی BlogSerializer به شکل زیر خواهد بود:

{
"title": "black python",
"author": 3
}


حالا اگر بخواهیم به جای PK، اطلاعات اضافی از Author نمایش دهیم، چند راه حل وجود دارد:

1. استفاده از depth:
با تنظیم پارامتر 1 = depth در Meta کلاس سریالایزر، می‌توانید مشخص کنید که تا چه عمقی از روابط مدل‌ها سریالایز شوند. این روش ساده و سریع است، اما کنترل کمتری بر روی داده‌های خروجی به شما می‌دهد.

class BlogSerializer(serializers.ModelSerializer):
class Meta:
model = Blog
depth = 1


خروجی BlogSerializer به شکل زیر خواهد بود:

{
"title": "python black",
"author": { "name": "amirhossein", "id": 1, "last_name": "some last name" }
}


2. استفاده از Nested Serializers:
با تعریف سریالایزرهای تو در تو، می‌توانید کنترل کاملی بر روی فیلدهایی که می‌خواهید از مدل‌های مرتبط نمایش دهید داشته باشید. این روش انعطاف‌پذیرتر است، اما نیاز به نوشتن کد بیشتری دارد , مثال:

class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ("name",)

class BlogSerializer(serializers.ModelSerializer):
author = AuthorSerializer()

class Meta:
model = Blog
fields = "__all__"


خروجی به شکل زیر خواهد بود:

{
"title": "black python",
"author": { "name": "amirhossein" }
}


مشکل N + 1 در هنگام استفاده از Depth یا Nested Serializer:
حتما باید در queryset خود از select_related یا prefetch_related استفاده کنید تا از بروز مشکل N + 1 جلوگیری کنید!

Django Serializers: Validators

1 : field level validators
برای اعتبار سنجی داده ها در سطح فیلد در drf باید از دستور زیر پیروی کنید:
class BlogSerializer(serializers.ModelSerializer):
....
def validate_<field name>(self, value): # validate_email
if vlaue in "_" :
serializers.ValidationError("some error")
return value

2 : object level validator

class BlogSerializer(serializers.ModelSerializer):
....
def validate(self, attrs):
if attrs.name == attrs.title :
serializers.ValidationError("name and title can not be same")
return value


Django Serializers: to_internal_value
متود to_internal_value در ModelSerializer قبل از اجرای اعتبارسنجی داده ها به داده های خام دسترسی دارد و میتوانید برای تغییر داده ها یا اضافه کردن داده ها قبل از اعتبارسنجی از اون استفاده کنید:
class BlogSerializer(serializers.ModelSerializer):
....
def to_internal_value(self, data):
data["user"] = self.context["user"] # افزودن شی user به data
return super().to_internal_value(data)

نکته:
اقا حتما موقع return از super().to_internal_value(data) استفاده کنید و return data استفاده نکنید ; چون اینطوری باعث میشه تمام validatorهای modelSerializer که از روی مدل شما بطور پیشفرض ساخته شده , غیرفعال بشن!

Django Serializers: to_representation

ما میتوانیم این رو ش را override کنیم تا قبل از داده های سریالی که نمونه سریالسازبر میگرداند،
دستکاری داده ها را انجام دهیم , مثال:
class BlogSerializer(serializers.ModelSerializer):
....
def to_representation(self, instance):
resp = super().to_representation(instance)
resp['title'] = resp['title'].upper()
return resp


برای اطلاعات بیشتر به کتاب :django in production مراجعه کنید.
یه آمار بگیریم ببینیم دوستان چیکاره هستن 😄

لطفا همه شرکت کنن، بهمون برای تولید محتوای بهتر و مناسب تر کمک میکنه
Anonymous Poll
7%
فرانت کارم
73%
بک اند کارم (Django)
5%
بک اند کارم (Node.js)
15%
سایر
Forwarded from Python BackendHub (Mani)
https://martinheinz.dev/blog/92

یک پست خوب از بنیامین که تو گروه گذاشته بود که چرا نباید از ایمیج Alpine استفاده کنید. سه نکته همیشه موقع تصمیم گیری یادتون باشه:

۱. خیلی کم پیش میاد که یک چیزی خوبه مطلق باشه. همین که قدرت تصمیم گیری تو اپلیکیشن بالغی برای شما فراهم شده یعنی یک ترید آف وجود داشته که maintainer ها گذاشتن خودتون تصمیم بگیرید. اینکه ایمیج سایز کمتر بهتره واقعا جمله چرتیه! درستش اینه که ایمیج چیزه اضافه ای نداشته باشه که نیاز نداشته باشین و مراحل بیلدش درست باشه.

۲. همیشه تحقیق کنید. پیرو مورد یک, خیلی وقتا نیازه که تصمیم گیری کنید. اگه چند تا آپشن دارین, گوگل کنید که چرا اون آپشن بده. و drawback های اون آپشن چیه. درکش کنید چطور کار میکنه. همینطوری از یک توتوریال برندارین کپی پیست کنید.

۳. بهتره داکیومنت که چرا اون تصمیم رو گرفتین. تحقیق کردین, دراوبک هارو متوجه شدید, و طبق یک منطقی یک چیزی رو انتخاب کردین. سعی کنید این پروسه رو داکیومنت کنید, چون ۲ ماه دیگه ممکنه یادتون نباشه چرا اون تصمیم رو گرفتین. و یا هم تیمی هاتون ممکنه بعدا گیج بشن چرا فلان تصمیم گرفته شده. تو این مثال فکر کنید یک نفر بگه خب ما این مشکلی که تو این مقاله گفته شده رو نداریم, پس میریم از ایمیج Alpine استفاده میکنیم. ۱ سال دیگه همون مشکل پیش میاد, چون فرضیاتی که داشتین موقع تصمیم گیری دیگه درست نیست. اشتراک دانش یکی از عناصر مهم پویایی یک تیم و پروداکته.

@PyBackendHub
این article رو در مورد prompt engineering و قدم های بعدیش نوشتم
خوشحال میشم اگه بهش یه نگاه بندازید
https://msnp1381.github.io/posts/Evolution-Prompt/

@DevTwitter | <Nemat/>
Forwarded from Geek Alerts
۵ تا استارشیپ بدون سرنشین تا ۲ سال آینده پرتاب میشن، اگه موفقیت آمیز باشن تا ۴ سال دیگه SpaceX اولین انسان‌هارو به مریخ میفرسته.
سفر از زمین به مریخ فقط هر دو سال یک بار شدنی هست، زمانی که سیارات در یک راستا هستن، قراره مثل تاکسی خطی باشه، یعنی هرکسی بخواد بتونه به مریخ سفر کنه.
اگه برنامه ۵ تا استارشیپ با مشکل مواجه بشه برنامه بعدی یعنی ارسال انسان به مریخ ۲ سال به تعویق میفته.
در واقع تاریخ اول ۲۰۲۸ هست و اگر این تاریخ انجام نشه برای ۲۰۳۰ قطعی هست.
X
@geekalerts
چرا PHP نسبت به بقیه زبان‌ها کندتر است و راهکار چیست؟ قسمت دوم


کندی PHP برای شرکت‌ها و سازمان‌های بزرگی مانند فیسبوک به یک چالش جدی تبدیل شده بود، زیرا هر فرآیند از ابتدا شروع می‌شد و این بار اضافی برای سازمان‌ها توجیه‌پذیر نبود. به همین دلیل فیسبوک تصمیم گرفت معماری HHVM را طراحی کند، که کد PHP را به بایت‌کد تبدیل کرده و به‌صورت Just-In-Time (JIT) کامپایل می‌کرد.

حالا JIT برای PHP چه کاری انجام می‌دهد؟
برای توضیح بهتر، تصور کنید یک تعمیرکار یخچال برای تعمیر روزانه در منازل، همه ابزارهای خود را با خودش ببرد. این کار نه تنها او را خسته می‌کند، بلکه باعث مصرف بیش از حد انرژی و منابع هم می‌شود.

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

و jit دقیقاً همین کار را برای کامپایل یک برنامه انجام می‌دهد؛ یعنی هر بخش از کد فقط زمانی که به آن نیاز باشد، کامپایل و اجرا می‌شود.

فیسبوک با این روش تونست یک پلتفرم بزرگ رو در اون زمان با php که تقریبا در زبان php ناممکن به نظر میرسید رو عملی کنه

اما در وردپرس...

@poinarir پوینا
Je Veux
ZAZ
Old but gold
Forwarded from Codino School (ایمان غفوری)
Media is too big
VIEW IN TELEGRAM
▪️این داستان: آنچه درباره Repository Pattern نمی‌دانستید. (در قالب تصویر)

(رکورد طولانی ترین کلیپ کدینو هم شکسته شد.😏)

@codino
Forwarded from کانال مهرداد لینوکس (Mehrdad Linux)
اگر برای یک محصول پولی پرداخت نمی‌کنید، یعنی خود شما محصول هستید

لینکدین برای آموزش مدل‌های هوش مصنوعی خود از داده‌های کاربران استفاده کند
البته می‌توان استفاده از داده‌ها برای آموزش مدل‌های آینده را در تنظیمات حساب خود غیرفعال کرد.
#AI #هوش_مصنوعی


به‌روزرسانی :
برای اروپا و انگلستان برای حمایت از حقوق کاربران اعمال نمیشود
Forwarded from Python Hints
چیزی که درد واقعه رو بیشتر می‌کنه

#معدن_طبس
Forwarded from Gopher Academy
🔵 عنوان مقاله
Awesome Ebitengine: A Curated List of Ebitengine Resources

🟢 خلاصه مقاله:
مقاله‌ی مورد بررسی به معرفی و بررسی Ebitengine، یک API قدرتمند برای برنامه‌نویسی گرافیک‌های 2D و توسعه بازی‌ها به زبان Go، پرداخته است. Ebitengine به دلیل عملکرد بالا و سادگی استفاده، در میان توسعه‌دهندگان بازی پرطرفدار است. مقاله شامل فهرستی از بازی‌هایی است که با استفاده از این API نوشته شده‌اند، کتابخانه‌هایی که می‌توان به همراه آن استفاده کرد، و اطلاعات بیشتری در این زمینه. این فهرست می‌تواند به عنوان منبعی کامل برای توسعه‌دهندگان علاقه‌مند به استفاده از Ebitengine و گسترش قابلیت‌های آن در پروژه‌های خود عمل کند و کمک‌های فراوانی در فرآیند توسعه بازی‌های 2D به آن‌ها ارائه دهد.

🟣لینک مقاله:
https://github.com/sedyh/awesome-ebitengine


👑 @gopher_academy
🔸 یه سایت پیدا کردم که داخلش میتونید به صورت رایگان تصویری که میخواید رو آپلود کنید و با لینکی که بهتون میده داخل پروژه هاتون ازش استفاده کنید

این سایت کاملا رایگان و نامحدوده و برای استفاده ازش، کافیه فقط وارد وبسایتش بشید و عکستون رو اپلود کنید تا لینکشو بهتون بده

#️⃣ #website #image

🚀 @coolycode
حدود 180 هزار hashtag اکستنشن به صورت رسمی در hashtag کروم استور گوگل برای استفاده کاربران منتشر شده و بازار جهانی اون طبق گزارش های رسمی 75 میلیارد دلار ارزش گذاری شده و پیش بینی میشه این رقم تا سال 2030 به 125 میلیارد دلار برسه !

من در توسعه اکستنشن های مختلفی شریک بودم که سعی میکنم از تجربیات خودم برای شما بیشتر بگم تا شما هم بتونین به راحتی وارد این مارکت بشید و اپ های خودتون رو توی مارکت منتشر کنین !

در قدم اول سعی دارم به شما بگم که چطور میتونین یه اکستنشن کروم بنویسین ، اکستنشن ها ساختار بسیار ساده و جذابی دارن که شما میتونین با زبان های HTML ، CSS ، Javascript پروژه های خودتون رو توسعه بدین .

ایجاد یک فایل manifest.json
این فایل قلب اکستنشن شماست و اطلاعاتی مثل نام اکستنشن، نسخه و مجوزهایی که نیاز داره رو توش مشخص می‌کنید.

نوشتن یک اسکریپت ساده
در فایل background.js یا content.js کدهایی می‌نویسید که اکستنشن شما رو فعال می‌کنه. مثلاً می‌تونید با content scripts به صفحات وب دسترسی پیدا کنید.
اضافه کردن UI
می‌تونید با HTML، CSS و JavaScript یک popup برای اکستنشن‌تون طراحی کنید که به کاربر نشون بده چه کاری می‌تونید انجام بدید.

نصب اکستنشن در حالت Developer
و در نهایت، با استفاده از بخش "Manage Extensions" در کروم، اکستنشن‌تون رو تست کنید. فقط کافیه حالت Developer رو فعال کنید و پوشه پروژه‌تون رو بارگذاری کنید.

شما میتونید آموزش کامل ساخت یک اکستنشن رو توی لینک زیر در وبلاگ من بخونین

https://blog.rezaghz.com/1403/07/how-to-develop-chrome-extension/

@DevTwitter | <Reza Ghasemzadeh/>
ماشالله همه جنگو کارن 😐😂
Forwarded from 🎄 یک برنامه نویس تنبل (Raymond Dev)
🔶 خالق وردپرس، سرویس هاستینگ WP Engine را «غده سرطانی» می‌داند

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

او از کاربران خواست هنگام تمدید قراردادهایشان، به‌جای WP Engine از شرکت‌های دیگر مانند Hostinger و Pressable استفاده کنند.

#خبر

@TheRaymondDev
Forwarded from Syntax | سینتکس (Daimon)
نکات مهم اجرای جنگو با Gunicorn

توضیح درباره Gunicorn
نمیخوام توضیحات زیادی بدم حوصلتون سر بره پس همون سه خط معرفی که تو وب سایت gunicorn نوشته رو براتون یکم شفافش میکنم:
اسمش مخفف green unicorn هستش
جی یونیکورن یک http سرور هستش که از استاندارد WSGI(Web server gateway interface) برای اجرای برنامه های وب پایتون استفاده میکنه.
استاندارد WSGI برای این بوجود اومد تا هر فریم ورک وب پایتونی روش خودشو واسه ارتباط پیاده نکنه و همه از یه استاندارد مشخص استفاده کنن.

در ادامه میگه gunicorn برای unix هستش و برای سیستم عامل هایی مثل مک و لینوکس طراحی شده.

بعدش میگه که جی یونیکورن از مدل pre-fork worker استفاده میکنه حالا این به چه معنیه؟
جی یونیکورن کاری که میکنه اینه قبل اینکه شروع به پردازش درخواست ها کنه، میاد و به اندازه ای که تنظیم کردید worker ایجاد میکنه که هر worker درخواست هارو بطور مستقل پردازش میکنه.

بعدشم میگه با فریم ورک های وب مختلفی سازگاره که اینم میتونیم دلیلش رو این بدونیم داره برای ارتباط از استاندارد WSGI استفاده میکنه.

قسمت آخرشم میگه light resource هستش و منابع کمی مصرف میکنه همچنین برای ترافیک بالا عملکرد خوبی داره.

خب جی یونیکورن این ادعا هارو میکنه اما بیاید با چند تا مثال شرایطی رو بررسی کنیم که شما به غلط دارید از جی یونیکورن استفاده میکنید:

مثال اول
gunicorn --chdir config config.wsgi:application -b 0.0.0.0:8000

اگه با این دستور جی یونیکورن رو اجرا کنید باید به این نکته دقت کنید بصورت پیشفرض براتون فقط یدونه worker میسازه که این اصلا خوب نیست. خود جی یونیکورن پیشنهاد میده حتی اگه یدونه core دارید 4 تا ورکر بسازید و یه فرمولی هم داده که میگه«تعداد هسته های سی پی یو رو ضربدر 2 به علاوه یک کنید»
همچنین به شما اطمینان داده همین تعداد ورکر هزاران ریکوئست رو میتونن پاسخ بدن پس تعداد ورکر هارو الکی زیادش نکنید.
البته به کیس شما هم بستگی داره.
دستور بهتر برای اجرا اینه تعداد ورکر هارو مشخص کنیم:
gunicorn --workers 5 --chdir config config.wsgi:application -b 0.0.0.0:8000


مثال دوم:
فرض کنید کاربر ها تو اپلیکیشن شما فایل هایی رو آپلود میکنن. شما پنج تا ورکر دارید.
وقتی پنج تا کاربر همزمان فایل آپلود کنن بنظرتون چه اتفاقی میوفته؟
پنج تا ورکر شما گیر یه io افتادن و مشغولن و درخواست های دیگه کاربرا انجام نمیشه. خب این وضعیتی نیست که باب میلیتون باشه!
برای حل این مشکل کافیه از gevent توی جی یونیکرون استفاده گنید؛
gunicorn --workers 1 -k gevent --chdir config config.wsgi:application -b 0.0.0.0:8000

با فلگ -k نوع کلاس ورکر رو مشخص میکنیم. حالا چرا از gevent استفاده میکنیم؟
کتابخونه gevent برای مدریریت همزمانی طراحی شده. میشه گفت یک نمونه lightweight thread هستش که این مدل موقع عملیات های IO سوئیچینگ انجام میده و در این صورت اگه به io خوردید براتون هندل میکنه.

کلی نکات دیگه هم قطعا هست که تو یه پست جا نمیشه
امیدوارم براتون مفید باشه

#python #django #gunicorn #gevent

@Syntax_fa