القناة (البرمجة)

في مجال الحوسبة، تُعدّ القناة نموذجًا للتواصل والتزامن بين الخيوط البرمجية عبر تمرير الرسائل . يمكن إرسال رسالة عبر قناة، ويستطيع أي برنامج أو خيط برمجي آخر استقبال الرسائل المرسلة عبر قناة لديه مرجع إليها، على شكل تدفق . تختلف تطبيقات القنوات، فقد تكون مُخزّنة مؤقتًا أو غير مُخزّنة، وقد تكون متزامنة أو غير متزامنة.

قنوات libthread

توفر مكتبة تعدد الخيوط ، libthread ، التي تم إنشاؤها لأول مرة لنظام التشغيل Plan 9 ، اتصالاً بين الخيوط يعتمد على قنوات ذات حجم ثابت.

أحداث OCaml

توفر وحدة أحداث OCaml قنوات مُصنفة للمزامنة. عند استدعاء دالتي الإرسال والاستقبال في الوحدة، فإنهما تُنشئان أحداث إرسال واستقبال مُقابلة يُمكن مزامنتها.

أمثلة

Lua Love2D

تُنفّذ مكتبة Love2D، التي تستخدم لغة البرمجة Lua، قنواتٍ مع عمليات دفع وسحب مشابهة للمكدسات. تُوقف عملية السحب العملية طالما توجد بيانات في المكدس. أما عملية الطلب فهي مكافئة لعملية السحب، إلا أنها تُوقف العملية حتى تتوفر بيانات في المكدس.

-- سلسلة نصية تحتوي على التعليمات البرمجية التي سيتم تفسيرها بواسطة دالة مثل loadstring()، -- ولكن على جانب C لبدء سلسلة رسائل أصلية.local threadCode = [[  love.thread.getChannel("test"):push("Hello world!") ]]دالة love.load () -- بدء الخيط. thread = love.thread.newThread(threadCode ) thread : start ( ) -- سيتوقف الخيط حتى يتم إخراج عبارة "Hello world!" من مكدس قناة test. نظرًا لإمكانية إخراج القناة من المكدس قبل بدء تنفيذ الخيط، فقد لا توجد بيانات على المكدس. في هذه الحالة ، استخدم :demand() بدلاً من :pop() لأن :demand() سيتوقف حتى تتوفر بيانات على المكدس ثم يُعيدها. print ( love.thread.getChannel ( " test " ) : demand ()) يمكن للخيط الآن الانتهاء. end

XMOS XC

توفر لغة البرمجة XC الخاصة بنظام XMOS نوعًا أساسيًا يُسمى "Chan" ومعاملين "<:" و ":>" لإرسال واستقبال البيانات من قناة. [ 1 ]

في هذا المثال، يتم تشغيل خيطين برمجيين على شريحة XMOS، لتنفيذ السطرين الموجودين في كتلة "par". يرسل السطر الأول الرقم 42 عبر القناة، بينما ينتظر السطر الثاني حتى يتم استقباله، ثم يقوم بتعيين قيمة x. كما تسمح لغة XC بالاستقبال غير المتزامن على القنوات من خلال عبارة select.

تشان ج ؛ كثافة العمليات س ; قدم المساواة { ج <: 42 ؛ ج :> س ; }

يذهب

يؤدي هذا الجزء من كود Go وظيفة مشابهة لكود XC. أولًا، يتم إنشاء القناة c، ثم يتم إنشاء روتين فرعي (goroutine) يرسل القيمة 42 عبر القناة. عند إدخال الرقم، يتم تعيين قيمة x للقناة إلى 42. تسمح لغة Go للقنوات بتخزين المحتويات مؤقتًا، بالإضافة إلى استقبال البيانات دون حظر باستخدام كتلة select. [ 2 ]

c := make ( chan int )دالة go () { c <- 42 }()x := <- c

الصدأ

توفر لغة Rust قنوات غير متزامنة للتواصل بين الخيوط. تسمح القنوات بتدفق أحادي الاتجاه للمعلومات بين نقطتي نهاية: Senderو Receiver. [ 3 ]

استخدم std :: sync :: mpsc ؛ استخدم std :: thread ؛fn main () { let ( tx , rx ) = mpsc :: channel ();thread :: spawn ( move || { tx . send ( 123 ). unwrap (); });let result = rx.recv (); println! ( "{:?} " , result ) ; }

التطبيقات

إضافةً إلى استخدامها الأساسي في التواصل بين الخيوط، يمكن استخدام القنوات كأداة أساسية لتنفيذ العديد من بنيات البرمجة المتزامنة الأخرى التي يمكن تمثيلها كتدفقات بيانات. على سبيل المثال، يمكن استخدام القنوات لإنشاء المستقبلات والوعود ، حيث يمثل المستقبل قناةً ذات عنصر واحد، بينما يمثل الوعد عمليةً ترسل بيانات إلى القناة، مُحققةً بذلك المستقبل. [ 4 ] وبالمثل، يمكن إنشاء المُكرِّرات مباشرةً من القنوات. [ 5 ]

قائمة التطبيقات

قائمة بتطبيقات القنوات غير القياسية والقائمة على المكتبات

  • بالنسبة للغة سكالا:
    • CSO - كائنات سكالا المتصلة [ 6 ] هي لغة برمجة خاصة بالمجال (DSL) كاملة للاتصال والتزامن القائمين على القنوات، وتُعدّ بدائياتها الدلالية تعميمات لبدائيات OCCAM. وقد استُخدمت CSO منذ عام 2007 في تدريس البرمجة المتزامنة، ويمكن الاطلاع على محاضرات ذات صلة مع تطبيق ThreadCSO. [ 7 ]
  • بالنسبة للغة C++:
  • بالنسبة للغة Rust:
    • طوكيو
    • قناة غير متزامنة
    • العارضة

مراجع

  1. "دليل برمجة XMOS | XMOS" . مؤرشف من الأصل بتاريخ 2016-03-04 . تم الاطلاع عليه بتاريخ 2015-05-10 .
  2. "Effective Go - the Go Programming Language" .
  3. "القنوات - رست بالأمثلة" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 28 نوفمبر 2020 .
  4. " المستقبلات " مؤرشفة بتاريخ 4 ديسمبر 2020 في أرشيف الإنترنت ، أنماط لغة Go مؤرشفة بتاريخ 11 نوفمبر 2020 في أرشيف الإنترنت
  5. " المكررات " مؤرشفة بتاريخ 15 أكتوبر 2020 في أرشيف الإنترنت ، أنماط لغة Go مؤرشفة بتاريخ 11 نوفمبر 2020 في أرشيف الإنترنت
  6. سوفرين، برنارد (13 يوليو 2021)، ThreadCSO (ملف PDF) ، تم الاطلاع عليه بتاريخ 17 فبراير 2023
  7. سوفرين، برنارد (2021-07-13)، ThreadCSO ، تم الاطلاع عليه بتاريخ 2023-02-17
  8. "stlab هو العمل المستمر لما كان يُعرف سابقًا باسم مختبر تقنيات البرمجيات في Adobe. مكتبات Adobe المصدرية (ASL) ومكتبات المنصات ومكتبات stlab الجديدة مُستضافة على GitHub" . 31 يناير 2021.