ورود

View Full Version : چه وقت باید از async و await استفاده کرد ؟



mf_007
یک شنبه 04 بهمن 1394, 15:35 عصر
سلام ،
چند تا سوال دارم در این مورد . واقعا گیجم کرده چند تا مقاله خوندم ولی به نتیجه نرسیدم.

1- کی باید از async و await در mvc استفاده کرد ؟

2- مزیتش چیه ؟

3-استفاده ناصحیح ازش باعث می شه چه اتفاقی بیفته ؟ (چون یه سریا رو دیدم که مثلا تو لایه سرویس ازش استفاده می کنند ولی وقتی می پرسی برای چی جواب درستی نمی دن و یا نمی دونن چرا استفاده می کنن)

salar IT man
یک شنبه 04 بهمن 1394, 20:35 عصر
یه سری به این مقاله بزنید. (http://www.dotnettips.info/courses/topic/14/c5de2b2f-ff5c-4baf-9b59-6d2d79528524)

این هم خوب است (https://msdn.microsoft.com/en-us/library/ee728598(v=vs.100).aspx#choosing_synchronous_or_as ynchronous_action_methods) ؛ البته تفاوت مدیریت درخواست ها به صورت همزمان و نا همزمان بیشتر مد نظر است در این مقاله.

hakim22
یک شنبه 04 بهمن 1394, 21:07 عصر
اگه ساده بگیم سایتی که با ASP طراحی میشه روی IIS کار میکنه. فرض کنید این IIS مثل یک ایستگاه قطار باشه. و هر درخواست یک قطار. که باید مسافرشو خالی کنه و مسافر جدید سوار کنه و بره و نوبت قطار بعدی برسه.

وقتی درخواستی دارید که خیلی سبکه و فشار زیادی روی سروی نمیاره میتوانید به دنبال هم به سرور بفرستید. چون کار هر قطار خیلی سریع تموم میشه (در چند هزارم ثانیه) عملا بقیه قطارها معطل نمیشن و نوبتشون زود میرسه. وقتی کار خالی کردن و سوار کردن یک قطار خیلی طول میکشه بهتره که دو خط یا چند خط دیگه برای پیاده شدن و سوار شدن قطارها ایجاد بشه. در واقع چند صف موازی کنار هم باشن که قطارها کمتر در صف معطل بشن.

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

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

مثلا در سایت شما کاربرها میتونن پیامک ارسال کنند. شما برای ارسال پیامک از وب سرویس استفاده میکنید. وقتی یک کاربر درخواست ارسال پیامک میده شما درخواستی به سرور مربوطه ارسال میکنید. تا زمانی که جواب از وب سرویس پیامک برنگرده کاربر دیگری نمیتونه پیامک ارسال کنه. مگر اینکه متد به صورت Async باشه.

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

mf_007
یک شنبه 04 بهمن 1394, 22:22 عصر
اگه ساده بگیم سایتی که با ASP طراحی میشه روی IIS کار میکنه. فرض کنید این IIS مثل یک ایستگاه قطار باشه. و هر درخواست یک قطار. که باید مسافرشو خالی کنه و مسافر جدید سوار کنه و بره و نوبت قطار بعدی برسه.

وقتی درخواستی دارید که خیلی سبکه و فشار زیادی روی سروی نمیاره میتوانید به دنبال هم به سرور بفرستید. چون کار هر قطار خیلی سریع تموم میشه (در چند هزارم ثانیه) عملا بقیه قطارها معطل نمیشن و نوبتشون زود میرسه. وقتی کار خالی کردن و سوار کردن یک قطار خیلی طول میکشه بهتره که دو خط یا چند خط دیگه برای پیاده شدن و سوار شدن قطارها ایجاد بشه. در واقع چند صف موازی کنار هم باشن که قطارها کمتر در صف معطل بشن.

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

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

مثلا در سایت شما کاربرها میتونن پیامک ارسال کنند. شما برای ارسال پیامک از وب سرویس استفاده میکنید. وقتی یک کاربر درخواست ارسال پیامک میده شما درخواستی به سرور مربوطه ارسال میکنید. تا زمانی که جواب از وب سرویس پیامک برنگرده کاربر دیگری نمیتونه پیامک ارسال کنه. مگر اینکه متد به صورت Async باشه.

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

ممنون از شما
شما مثال پیامک رو زدین حالا من می گم اگر مثلا عملیات خوندن یه سری رکورد از دیتابیس رو در نظر بگیریم اگر 1000 کاربر همزمان این درخواست رو به سرور ارسال کنند این 1000 درخواست دریک صف قرار می گیره یکی یکی اجرا می شه درسته ؟ حالا اگر این عملیات به صورت async تعریف بشه هر کدوم از این درخواست ها در یک ترد انجام می شه درسته ؟
حالا سوال اینجاست این ترد های اضافی که ایجاد شده و ممکنه با بالارفتن تعداد کاربران در یک لحظه بیشتر هم بشه مشکلی پیش نمیاره ؟ چطور می شه این ها رو مدیریت کرد ؟ یا خود iis این کار رو انجام می ده ؟

hakim22
دوشنبه 05 بهمن 1394, 10:55 صبح
اینجوری نیست که برای هر درخواست یک Thread ایجاد بشه. فقط تضمین نمیشه که Thread که درخواست رو دریافت کرده پاسخ رو ارسال کنه. اینکه هر Thread یک درخواست رو مدیریت کنه روش قدیمی تری هست که کارایی کمتری هم داره. الان در IIS یک Application Pool هست و در واقع استخری از Thread ها در اختیار وب سایت قرار میگیره. مدیریت دقیقش با IIS هست.

هر سیستمی یک ظرفیتی داره. استفاده از Async در بعضی مواقع خیلی کارایی داره و در بعضی مواقع عکس عمل میکنه و همیشه توصیه نمیشه. در Node.js که محیط نسبتا جدیدی برای پیاده سازی پروژه های وب است تمامی عملیاتهای سمت سرور به صورت موازی یا Async انجام میشه و در این زبان با استفاده از تنها یک Thread تمامی درخواستها مدیریت میشوند و اتفاقا این موضوع Node.js رو یکی از سریعترین و بهینه ترین ابزار برای پیاده سازی سایتها با بازدید بالاست. البته اینکه چطور چنین چیزی ممکنه بحث جداگانه است.

پیشنهاد من این است که شما سایت هارو کاملا بر پایه ی Sync پیاده کنید مگر اینکه جایی مطمئن باشید باید از Async استفاده کنید. در سرورهای اشتراکی Async اثری نداره. باید یک پردازنده ی چند هسته ای داشته باشید که اثر واقعی نشون داده بشه.(هر هسته تبدیل به یک ایستگاه جدا میشه)سایت های با بازدید چند هزار در روز هم از Async بودن نفع زیادی نمی برند. هم بازدید باید بالا باشد و هم عملی که در سرور انجام میشود باید سنگین باشد که Async به کار بیاد .

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

r4hgozar
سه شنبه 06 بهمن 1394, 08:49 صبح
ممنون از شما
حالا اگر این عملیات به صورت async تعریف بشه هر کدوم از این درخواست ها در یک ترد انجام می شه درسته ؟

سلام.
اقای حکیم کامل توضیح دادن.
اما شما فکر کن 1000 نفر رو بفرستی تو جاده ای که ظرفیت 100 نفر رو داره اینجا دچار مشکل میشی.
async به این صورت نیست چون میاد و صف ایجاد می کنه کاملا کارایی سیستم رو بالا ببره.
شما باید درست و در جای خودش استفاده کنید. به نظرم بهترین مثال نگاه کردن identity sample.
بعضی وقت های تو برنامه جاهایی هست که شما مطالب در در چند جا درج می کنی یا میفرستی و اینها تاثیری در روند کاری هم ندارن. مثل ارسال ایمیل یا همون اس ام اس بعد ازخرید . شما می تونید این رو به async بدین و بقیه کارهاتون رو انجام بدین.