كتاب "التنافسية والتزامن على منصة .NET. أنماط التصميم الفعال "

صورة مرحبا ، habrozhiteli! يقدم كتاب Riccardo Terrell إرشادات حول كيفية إنشاء برامج تنافسية وقابلة للتطوير في .NET ، مع إبراز فوائد النموذج الوظيفي وتوفير الأدوات والمبادئ المناسبة للمنافسة بسهولة وبشكل صحيح. نتيجة لذلك ، مع التسلح بمهارات جديدة ، ستتلقى المعرفة اللازمة لتصبح خبيرًا في تقديم حلول ناجحة عالية الأداء.

إذا كنت تكتب رمزًا متعدد مؤشرات الترابط في .NET ، فقد يساعدك هذا الكتاب. إذا كنت مهتمًا باستخدام نموذج وظيفي لتبسيط البرمجة التنافسية وزيادة أداء التطبيقات ، فسيكون هذا الكتاب بمثابة دليل مهم لك. سوف يفيد أي مطور .NET يريد كتابة تطبيقات تنافسية ، رد الفعل وغير متزامنة التي الحجم والتكيف التلقائي لموارد الأجهزة المتاحة أينما تعمل هذه البرامج.

هيكل النشر: خارطة الطريق


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

  • يصف الفصل الأول المفاهيم والأهداف الأساسية للبرمجة التنافسية ، وكذلك أسباب استخدام البرمجة الوظيفية لكتابة التطبيقات متعددة الخيوط.
  • يستكشف الفصل 2 مجموعة من تقنيات البرمجة الوظيفية لتحسين أداء التطبيقات متعددة الخيوط. الغرض من هذا الفصل هو تزويد القارئ بالمفاهيم المستخدمة في بقية الكتاب وتقديم الأفكار القوية التي تنشأ من نموذج وظيفي.
  • الفصل 3 يعطي لمحة عامة عن مفهوم وظيفية من ثبات. يشرح كيفية استخدام قابلية التثبيط لكتابة البرامج التنافسية التي يمكن التنبؤ بها وتصحيحها وتنفيذ هياكل البيانات الوظيفية التي تكون آمنة في الخيط.

في الجزء الثاني ، يتم فحص نماذج مختلفة من البرمجة التنافسية في نموذج وظيفي في العمق. سنستكشف موضوعات مثل Task Parallel Library (TPL) ، وننفذ أنماطًا متوازية مثل Fork / Join ، divide and conquer ، و MapReduce. يناقش هذا القسم أيضًا التصميم التعريفي والتجريدات عالية المستوى في العمليات غير المتزامنة وبرمجة الوكلاء ودلالات دلالات نقل الرسائل.

  • يحدد الفصل 4 أساسيات المعالجة المتوازية لكميات كبيرة من البيانات ، بما في ذلك القوالب مثل Fork / Join.
  • يقدم الفصل الخامس أساليب أكثر تطوراً للمعالجة المتوازية لكميات كبيرة من المعلومات ، مثل التجميع الموازي ، وتقليل البيانات ، وتنفيذ قالب MapReduce الموازي.
  • يوفر الفصل 6 معلومات مفصلة حول الطرق الوظيفية لمعالجة تدفقات الأحداث (البيانات) في الوقت الفعلي باستخدام عوامل التشغيل الوظيفية عالية الترتيب في .NET Reactive Extensions لتكوين مزج أحداث غير متزامن. بعد ذلك ، سيتم استخدام الطرق المدروسة لتطبيق قالب تفاعلي للناشر والمشترك مصمم بشكل تنافسي.
  • يقدم الفصل 7 شرحًا لنموذج البرمجة القائم على المهام كما هو مطبق على البرمجة الوظيفية لتنفيذ العمليات التنافسية باستخدام قالب Monadic. ثم تستخدم هذه الطريقة لبناء خط أنابيب تنافسي يعتمد على نموذج برمجة وظيفي.
  • يخصص الفصل 8 لتنفيذ الحوسبة المتوازية غير المحدودة باستخدام نموذج البرمجة C # غير المتزامن. يناقش هذا الفصل أيضًا طرق معالجة الأخطاء وطرق إنشاء عمليات غير متزامنة.
  • يصف الفصل 9 سير العمل غير المتزامن في F #. يوضح كيف أن التقييم المؤجل والصريح في هذا النموذج يسمح بدلالات تركيبية أعلى. بعد ذلك سنتعلم كيفية تطبيق التعبيرات الحسابية المخصصة لرفع مستوى التجريد إلى البرمجة التصريحية.
  • يوضح الفصل 10 كيف يمكن ، بناءً على المعرفة المكتسبة في الفصول السابقة ، والمولدات والقوالب ، مثل Functor و Monad و Applicative ، إنشاء وتشغيل العديد من العمليات غير المتزامنة والتعامل مع الأخطاء دون آثار جانبية.
  • الفصل 11 يحلل البرمجة التفاعلية باستخدام نموذج المراسلة البرمجيات. يكشف عن مفهوم العزلة الطبيعية كتقنية تكمل ثباتها وتسمح بإنشاء برامج تنافسية. يركز هذا الفصل على فئة MailboxProcessor المستخدمة في F # لتوزيع العمل المتوازي باستخدام برمجة الوكيل ونهج خالٍ من الموارد.
  • يصف الفصل 12 برمجة العوامل باستخدام مكتبة TPL Dataflow من .NET مع أمثلة في C #. إنه يوضح كيفية تنفيذ العوامل عديمي الجنسية والحالة في C # ، وكذلك كيفية إجراء العديد من العمليات الحسابية بالتوازي التي تبادل البيانات مع بعضها البعض ، وذلك باستخدام (إرسال) رسائل في نمط خط أنابيب.

يوضح الجزء الثالث كيفية تطبيق جميع الأساليب الوظيفية للبرمجة التنافسية التي تمت دراستها في الفصول السابقة.

  • يقدم الفصل 13 مجموعة من الوصفات المفيدة لحل المشكلات التنافسية المعقدة ، مأخوذة من الممارسة الحقيقية. تستخدم هذه الوصفات جميع الأنماط الوظيفية الموضحة في هذا الكتاب.
  • يصف الفصل 14 تطبيقًا مكتمل التطوير تم تطويره وتطبيقه باستخدام قوالب وأساليب تنافسية وظيفية تمت دراستها في هذا الكتاب. ستقوم بإنشاء تطبيق خادم سريع التحجيم وقابل للاستجابة وبرنامج عميل سريع الاستجابة. يحتوي الكتاب على نسختين: أحدهما لنظام iOS (iPad) ، تم إنشاؤه باستخدام Xamarin Visual Studio ، والثاني - تم إنشاؤه باستخدام Windows Presentation Foundation (WPF). لضمان أقصى قدر من قابلية التوسع في تطبيق الخادم ، يتم استخدام مزيج من نماذج البرمجة المختلفة ، مثل غير المتزامن ، العامل ، والتفاعلي.

يحتوي الكتاب أيضًا على ثلاثة تطبيقات.

  • يصف الملحق "أ" بإيجاز المفاهيم الأساسية للبرمجة الوظيفية ، كما يعرض النظرية الأساسية للطرق الوظيفية المستخدمة في هذا الكتاب.
  • يكشف الملحق B المفاهيم الأساسية للغة F #. هذه مراجعة أساسية لـ F # ، والتي ستتيح لك التعرف على هذه اللغة والشعور بالراحة أثناء قراءة كتاب.
  • يوضح الملحق B العديد من الطرق التي تعمل على تبسيط التفاعل بين سير العمل غير المتزامن في F # ومهمة .NET في C #.

مقتطفات. 11.6. F # MailboxProcessor: 10،000 وكيل لـ Game of Life


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

في هذا القسم ، سوف نستخدم العديد من مثيلات MailboxProcessor لتنفيذ لعبة Game of Life (اللعبة "Life") ( wiki-eng و wiki-rus ). وفقًا لـ Wikipedia ، فإن لعبة الحياة ، بكلمات بسيطة ، هي آلية آلية. هذه لعبة بدون لاعبين - بمعنى آخر ، عندما تبدأ اللعبة بتكوين أولي عشوائي ، فإنها تعمل بدون أي مدخلات أخرى. تتكون اللعبة من مجموعة من الخلايا التي تشكل شبكة ؛ في كل خلية يتم استيفاء العديد من القواعد الرياضية. يمكن للخلايا أن تعيش وتموت وتتضاعف. تتفاعل كل خلية مع ثمانية من الجيران (الخلايا المجاورة). لنقل الخلايا وفقًا لهذه القواعد ، من الضروري حساب الحالة الجديدة للشبكة باستمرار.

لعبة الحياة لديها القواعد التالية:

  • إذا كانت الخلية بها جارة واحدة فقط أو لا يوجد جيران لها ، فإنها تموت "من الوحدة" ؛
  • إذا مات أربعة أو أكثر من الجيران للخلية ، فإنها تموت "بسبب الزيادة السكانية" ؛
  • إذا كان للخلية جارتان أو ثلاثة ، فسيبقى على قيد الحياة ؛
  • إذا كان للخلية ثلاثة جيران ، فإنها تتكاثر.

اعتمادا على الظروف الأولية ، تشكل الخلايا هياكل مميزة في جميع أنحاء اللعبة. من خلال التطبيق المتكرر للقواعد ، يتم إنشاء الأجيال التالية من الخلايا حتى تصل الخلايا إلى حالة مستقرة (الشكل 11.12).

توضح القائمة 11.9 تطبيق خلية Game of Life AgentCell ، استنادًا إلى أنواع F # الخاصة بـ MailboxProcessor. تتفاعل كل خلية عاملة مع الخلايا المجاورة عبر المراسلة غير المتزامنة ، مما يخلق لعبة حياة متوازية تمامًا. للإيجاز ، لقد حذفت بعض أجزاء الكود ، لأنها لا تتعلق بالموضوع الرئيسي في المثال. ستجد التنفيذ الكامل في الكود المصدري لهذا الكتاب ، المنشور على موقع الناشر.

صورة

صورة

يصف AgentCell خلية في شبكة Game of Life. المفهوم الأساسي هو أن كل وكيل يتبادل المعلومات مع الخلايا المجاورة حول حالته الحالية من خلال الرسائل غير المتزامنة. ينشئ هذا القالب سلسلة من الاتصالات المتوازية المترابطة التي تستخدم جميع الخلايا التي ترسل حالتها المحدثة إلى MailboxProcessor updateAgent. بعد تلقي هذه البيانات ، يقوم updateAgent بتحديث الرسومات في واجهة المستخدم (سرد 11.10).

صورة

صورة

updateAgent ، كما يوحي الاسم ، يقوم بتحديث حالة كل بكسل وفقًا لقيمة الخلية المستلمة في رسالة التحديث. يحافظ العامل على حالة البكسل ويستخدمه لإنشاء صورة جديدة عندما تنتقل جميع الخلايا إلى حالتها الجديدة. يقوم UpdateAgent بتحديث واجهة المستخدم الرسومية WPF باستخدام هذه الصورة الجديدة التي تطابق شبكة Game of Life الحالية:

do! Async.SwitchToContext ctx image.Source <- createImage pixels do! Async.SwitchToThreadPool() 

من المهم ملاحظة أن updateAgent يستخدم سياق المزامنة الحالي لتحديث وحدة تحكم WPF بشكل صحيح. يتم تبديل مؤشر الترابط الحالي إلى مؤشر ترابط واجهة المستخدم باستخدام وظيفة Async.SwitchToContext (الموصوفة في الفصل 9).

يُنشئ الجزء الأخير من التعليمات البرمجية لتنفيذ Game of Life شبكة تُستخدم كملعب للخلايا ، ثم يقوم الموقت بإخطار الخلايا عن الحاجة إلى إجراء تحديث (سرد 11.11). في هذا المثال ، الشبكة عبارة عن مربع من 100 × 100 خلية ، أي ما مجموعه 10000 خلية (كائنات MailboxProcessor) ، ويتم حسابها بالتوازي مع مؤقت كل 50 مللي ثانية ، كما هو موضح في الشكل. 11.13. تتفاعل عشرة آلاف من كائنات MailboxProcessor وتحديث واجهة المستخدم 20 مرة في الثانية (يظهر الرمز الذي يجب الانتباه إليه بالخط العريض).

صورة

صورة

يتم إرسال الإشعارات إلى جميع الخلايا (الوكلاء) بالتوازي باستخدام PLINQ. الخلايا هي متواليات F # يتم التعامل معها على أنها NET IEnumerable ، مما يجعل دمج LINQ / PLINQ سهلًا.

صورة

عند تنفيذ التعليمات البرمجية ، يقوم البرنامج بإنشاء 10000 كائن F # من النوع MailboxProcessor في أقل من 1 مللي ثانية ، بينما يشغل العملاء أقل من 25 ميغابايت من الذاكرة. ! مثير للإعجاب

ملخص


  • يوفر نموذج البرمجة المعتمد على العوامل بشكل طبيعي ثباتًا وعزلًا عند كتابة أنظمة تنافسية ، مما يجعل مناقشة الأنظمة المعقدة أكثر سهولة ، حيث يتم تغليف العناصر داخل الكائنات النشطة.
  • يحدد البيان التفاعلي خصائص تطبيق نظام تفاعلي يتسم بالمرونة والازدحام والتوسع.
  • العزلة الطبيعية مهمة لكتابة رمز تنافسي دون حظر. في برنامج متعدد الخيوط ، تقوم العزلة بحل مشكلة الحالات المشتركة من خلال تزويد كل مؤشر ترابط بنسخة من البيانات لإجراء عمليات حسابية محلية. عند استخدام العزل ، لا يوجد أي حالة سباق.
  • كونها غير متزامنة ، تكون العوامل بسيطة لأنها لا تمنع مؤشرات الترابط أثناء انتظار الرسائل. نتيجة لذلك ، يمكنك استخدام مئات الآلاف من الوكلاء في تطبيق واحد دون تأثير كبير على مقدار الذاكرة.
  • يوفر كائن MailboxProcessor F # اتصالًا ثنائي الاتجاه: يمكن للعامل استخدام قناة غير متزامنة لإرجاع (الاستجابة) إلى كائن الاستدعاء نتيجة الحساب.
  • يعد نموذج برمجة الوكيل في F # عبر MailboxProcessor أداة ممتازة لحل الاختناقات في التطبيقات ، مثل الوصول المتعدد لقاعدة البيانات المتزامنة. في الواقع ، بمساعدة الوكلاء ، يمكنك تسريع التطبيق بشكل كبير ، مع الحفاظ على استجابة الخادم.
  • تسمح لك لغات البرمجة الأخرى في .NET باستخدام F # type MailboxProcessor ، مع توفير طرق باستخدام نموذج البرمجة TPL المريح استنادًا إلى المهام.

»يمكن الاطلاع على مزيد من المعلومات حول الكتاب على موقع الناشر
» المحتويات
» مقتطفات

خصم 20٪ على كوبون للمتجولين - التزامن في .NET

عند دفع النسخة الورقية من الكتاب ، يتم إرسال نسخة إلكترونية من الكتاب عن طريق البريد الإلكتروني.

Source: https://habr.com/ru/post/ar453804/


All Articles