انتظار بناء Async Await - Perl

المقدمة
في Binary، لدينا كمية متزايدة من الكود الذي يستخدم Futures لتمثيل العمليات غير المتزامنة. قوة هذه الكائنات تأتي مع زيادة تعقيد كتابة كود قابل للقراءة يستفيد منها. لقد وصفت في مقالات مختلفة سبق كتبتها Futures واستخدامها. في هذا المقال، أود أن أقدم وحدة بناء جملة جديدة تحسن بشكل كبير القوة التعبيرية والنظام في كتابة الكود القائم على Future. هذه الوحدة هي Future::AsyncAwait (رابط CPAN).
البناء الجديد الذي تقدمه هذه الوحدة مبني على كلمتين رئيسيتين، async و await اللتين توفران معًا قدرة قوية جديدة لكتابة كود يستخدم كائنات Future. الكلمة المحجوزة await تجعل الدالة المحتوية تتوقف مؤقتًا أثناء انتظار استكمال future، وكلمة async تزين تعريف الدالة للسماح بحدوث ذلك. هاتان الكلمتان تجسدان فكرة إيقاف تشغيل جزء من الكود الجاري والذي ينتظر إتمام future، واستئنافه مرة أخرى في وقت لاحق بمجرد أن يكون هناك نتيجة جاهزة.

هذا يبدو الآن أنظف قليلًا من كيف قد يبدو باستخدام سلسلة ->then:

هذا البناء الجديد يترك أثرًا أكبر كثيرًا عندما نأخذ بعين الاعتبار هياكل الكود مثل حلقات foreach:

سابقًا، كان علينا استخدام Future::Utils::repeat لإنشاء الحلقة:

لأن الدالة بأكملها توقف مؤقتًا ثم تستأنف لاحقًا، يتم الاحتفاظ بقيم المتغيرات المحلية لاستخدامها لاحقًا:

إذا كنا سنفعل هذا باستخدام سلسلة ->then، فإننا سنضطر يا إما لرفع متغير إلى جسم الدالة الرئيسي لتخزين $message، أو استخدام مستوى إضافي من التعشيش والمسافة البادئة لجعل المتغير المحلي مرئيًا للكود التالي:

هذه الأمثلة النهائية مكافئة لكلٍ من النسخة التي تستخدم async و await أعلاه، ولكنها أطول بكثير، وتحتوي على الكثير من "الآلية" منخفضة المستوى لحل المشكلة، مما يحجب التدفق المنطقي لما يحاول الكود تحقيقه.
مقارنة مع لغات أخرى
هذا البناء ليس فريدًا لـ Perl - العديد من اللغات الأخرى قدمت ميزات مشابهة جدًا.
ES6، المعروف أيضًا باسم JavaScript (رابط):

Python 3 (رابط):

C# (رابط):

Dart (رابط):

في الواقع، مثل الأشكال المعروفة لأشياء مثل كتل if وحلقات while، يبدو أن بناء async/await يتحول إلى ميزة قياسية في العديد من اللغات.
الحالة الحالية
في وقت كتابة هذا، وصلت هذه الوحدة إلى الإصدار 0.21، وكانت نتيجة جولة مكثفة من تصحيح الأخطاء والتحسين خلال عطلة عيد الميلاد ورأس السنة الجديدة. بينما ليست جاهزة تمامًا للاستخدام الإنتاجي ولجميع الحالات بعد، بدأنا بالتجربة باستخدامها في عدد من مسارات الكود الأقل إلحاحًا للإنتاج (مثل اختبار الوحدة أو التكامل) للمساعدة في اكتشاف أية أخطاء أخرى قد تظهر، وتقييم مدى سرعة ومدى رغبتنا في دفع الاستخدام الأوسع لها في كود Binary.
هذا الإصدار يتعامل بالفعل مع الكثير من الحالات حتى غير التافهة، مثلًا بالتزامن مع بناء try/catch الذي توفره Syntax::Keyword::Try:

في الجزء 2، سنستعرض بعض تفاصيل التنفيذ، وبعض الأخطاء المعروفة، ونستكشف الخطوة التالية لهذه الوحدة وكيفية الاستفادة منها بأفضل شكل في Binary.
ملاحظة: تم تحويل هذا المنشور من https://tech.binary.com/ (مدونتنا التقنية القديمة). مؤلف هذه المقالة هو https://metacpan.org/author/PEVANS