مواقع بتصميمات جديدة

لا تزال مشكلة C10k تمثل لغزًا للمبرمجين لإيجاد طريقة لحلها. بشكل عام ، يتعامل المطورون مع عمليات الإدخال / الإخراج الشاملة عبر الخيط ، epoll ، أو kqueue لتجنب برامجهم في انتظار مهمة باهظة الثمن. ومع ذلك ، فإن تطوير شفرة متزامنة يمكن قراءتها وخالية من الأخطاء يمثل تحديًا بسبب مشاركة البيانات والاعتماد على الوظيفة. على الرغم من أن بعض الأدوات القوية ، مثل Valgrind ، تساعد المطورين على اكتشاف حالة توقف تام أو مشكلات أخرى غير متزامنة ، فإن حل هذه المشكلات قد يستغرق وقتًا طويلاً عندما يزداد حجم البرنامج. لذلك ، العديد من لغات البرمجة مثل Python أو Javascript أو C ++ مخصصة لتطوير مكتبات أو أطر عمل أو بناء جملة أفضل لمساعدة المبرمجين في إدارة المهام المتزامنة بشكل صحيح. بدلاً من التركيز على كيفية استخدام واجهات برمجة التطبيقات المتوازية الحديثة ، تركز هذه المقالة بشكل أساسي على فلسفة التصميم وراء أنماط البرمجة غير المتزامنة.

يعد استخدام سلاسل الرسائل طريقة أكثر طبيعية للمطورين لإرسال المهام دون حظر السلسلة الرئيسية. ومع ذلك ، قد تؤدي مؤشرات الترابط إلى مشكلات في الأداء مثل تأمين الأقسام الهامة للقيام ببعض العمليات الذرية. على الرغم من أن استخدام حلقة الحدث يمكن أن يحسن الأداء في بعض الحالات ، إلا أن كتابة التعليمات البرمجية القابلة للقراءة تمثل تحديًا بسبب مشكلات رد الاتصال (على سبيل المثال ، رد اتصال الجحيم). لحسن الحظ ، قدمت لغات البرمجة مثل Python مفهومًا ، غير متزامن / انتظار ، لمساعدة المطورين على كتابة تعليمات برمجية يمكن فهمها بأداء عالٍ. يوضح الشكل التالي الهدف الرئيسي باستخدام المزامنة / الانتظار للتعامل مع اتصالات المقبس مثل استخدام الخيوط.
تعتبر معالجة عمليات الإدخال / الإخراج مثل اتصالات الشبكة واحدة من أغلى المهام في البرنامج. خذ خادم صدى بسيط لحظر TCP كمثال (المقتطف التالي). إذا كان العميل يتصل بالخادم بنجاح دون إرسال أي طلب ، فسيحظر اتصالات الآخرين. على الرغم من أن العملاء يرسلون البيانات في أسرع وقت ممكن ، لا يمكن للخادم معالجة الطلبات الأخرى إذا لم يكن هناك عميل يحاول إنشاء اتصال. أيضا ، معالجة طلبات متعددة غير فعالة لأنها تضيع الكثير من الوقت في انتظار استجابات I / O من الأجهزة مثل واجهات الشبكة. وبالتالي ، تصبح برمجة المقبس مع التزامن أمرًا لا مفر منه لإدارة الطلبات الشاملة.
خبير سيو

أحد الحلول الممكنة لمنع خادم ينتظر عمليات الإدخال / الإخراج هو إرسال المهام إلى مؤشرات ترابط أخرى. يوضح المثال التالي كيفية إنشاء مؤشر ترابط لمعالجة الاتصالات في وقت واحد. ومع ذلك ، فإن إنشاء العديد من مؤشرات الترابط قد يستهلك كل قوة الحوسبة دون إنتاجية عالية. والأسوأ من ذلك ، أن التطبيق قد يضيع الوقت في انتظار قفل لمعالجة المهام في الأقسام المهمة. على الرغم من أن استخدام مؤشرات الترابط يمكن أن يحل مشكلات الحظر لخادم مأخذ التوصيل ، إلا أن هناك عوامل أخرى ، مثل استخدام وحدة المعالجة المركزية ، ضرورية للمبرمج للتغلب على مشكلة C10k. لذلك ، بدون إنشاء سلاسل عمليات غير محدودة ، تعد حلقة الحدث حلاً آخر لإدارة الاتصالات.
سيو
يشتمل خادم المقبس البسيط الذي يحركه الحدث على ثلاثة مكونات رئيسية: وحدة إرسال / إخراج متعددة (على سبيل المثال ، تحديد) ، وجدولة (حلقة) ، ووظائف رد الاتصال (الأحداث). على سبيل المثال ، يستخدم الخادم التالي مضاعفة I / O عالية المستوى ، ومحددات ، داخل حلقة للتحقق من أن عملية I / O جاهزة أم لا. إذا كانت البيانات متاحة للقراءة / الكتابة ، فإن الحلقة تكتسب أحداث I / O وتنفذ وظائف رد الاتصال أو تقبل أو تقرأ أو تكتب لإنهاء المهام.

على الرغم من أن إدارة الاتصالات عبر سلاسل الرسائل قد لا تكون فعالة ، فإن البرنامج الذي يستخدم حلقة حدث لجدولة المهام ليس سهل القراءة. لتحسين إمكانية قراءة التعليمات البرمجية ، تقدم العديد من لغات البرمجة ، بما في ذلك Python ، مفاهيم مجردة مثل coroutine أو future أو async / await للتعامل مع I / O multiplexing. لفهم لغة المصطلحات البرمجية بشكل أفضل واستخدامها بشكل صحيح ، تناقش الأقسام التالية ماهية هذه المفاهيم ونوع المشكلات التي يحاولون حلها.

وظائف رد الاتصال

يتم استخدام وظيفة رد الاتصال للتحكم في تدفق البيانات في وقت التشغيل عند استدعاء حدث. ومع ذلك ، فإن الحفاظ على حالة وظيفة رد الاتصال الحالية أمر صعب. على سبيل المثال ، إذا أراد أحد المبرمجين تنفيذ مصافحة عبر خادم TCP ، فقد يطلب / هي تخزين الحالة السابقة في بعض الأماكن.

تعليقات

  1.  

     

    تعرف علي افضل نقل عفش مبارك الاكبير بالكويت مع شركة نقل عفش مبارك الكبير لنقل اثاث وعفش بالكويت

    نقل عفش مبارك الكبير

    ردحذف

إرسال تعليق

المشاركات الشائعة من هذه المدونة

افضل تصميم موقع