تجعله يتأخر وليست سبب بأن يتوقف بمعنى يتعطل!
كل طلب يصل إلى السيرفر تقوم thread باستقبال هذا الطلب والبدء بمعالجته، يحوي السيرفر على ما يسمى ب thread pool، اي مجموعة من threads بانتظار استقبال الطلبات ومعالجتها، لإن إنشاء thread جديدة عن وصول كل طلب امر مكلف نسبياً، لذلك وجد مفهوم thread pool هذا.
الآن، سيرفر مثل iis تقريبا يحوي على 5000 thread، تقوم thread بمعالجة الطلب والعودة لانتظار طلب جديد، بالتالي هناك حد معين لمعالجة الطلبات، خاصة اذا كانت المعالجة تتطلب وقت طويل نسبياً.
لو فرضنا ان تم استهلاك جميع threads ضمن thread pool بنفس اللحظة، وكانت كل thread مشغولة بمعالجة طويلة نسيباً، هنا تصبح استجابة السيرفر بطيئة، لانه سيقوم بتسجيل الطلب بانتظار انتهاء احدى threads لمعالجته.
لذلك هذه النقطة جوهرية جداً، وقد لا ينتبه لها البعض، الا لاحقاً عندما يصبح هناك ازدحام طلبات على التطبيق، لانه بالتأكيد الاستخدام العادي لا يشكل فرقاً كبيراً.
الآن نأتي للشق الثاني من السؤال async، بالتأكيد هي الحل، لكن وبما اننا كنا نتكلم عن threads وبأن كل thread مسؤولة عن استقبال الطلب ومعالجته حتى النهاية، اذا تطبيقنا حاليا عبارة عن single threaded application
والحل بأن يكون multi threaded application. وهكذا تصبح الية العمل
تقوم thread باستقبال الطلب وتمريره مباشرة الى thread اخرى لتقوم بمعالجته، وتعود هي فورا لتخديم المستخدمين او الطلبات الجديدة دون انتظار معالجة الطلب، وإنما بمجر انتهاء معالجة الطلب، تقوم thread المخصصة للمعالجة باخبار ال thread الاساسية بأنها انتهت، لتقوم بدورها بالرد على المستخدم.
شاهد هذا المثال من بيئة ASP.NET Core
public class NewsController : Controller
{
[HttpGet("news")]
public async Task<IActionResult> News()
{
// Request now received by thread 1 for example.
NewsViewModel model = new NewsViewModel();
// Request is being processed by another thread
// The main thread now go back to serve another request/user
// When the processing is finish, the thread will be informed.
// and continue after that
await model.GetNews();
// This code will not executed, until thread 2 finish its job
return View(model);
}
}
لاحظ كيف ان thread اخرى تقوم بمعالجة الطلب، واخبارنا عند انتهاءها.
بالتوفيق،،،