0Pricing
Kotlin Academy · درس

أنواع Channel: ‏Rendezvous وBuffered وConflated وUnlimited

اختر نوع Channel المناسب لنمط الاتصال لديك.

أنواع Channel: ‏Rendezvous وBuffered وConflated وUnlimited درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

منشئ Channel

أنشئ القنوات باستخدام Channel<T>(capacity). وتحدد السعة سلوك التخزين المؤقت وتعليق التنفيذ.

import kotlinx.coroutines.channels.Channel
val rendezvous = Channel<Int>()              // capacity 0
val buffered   = Channel<Int>(64)            // capacity 64
val unlimited  = Channel<Int>(Channel.UNLIMITED)
val conflated  = Channel<Int>(Channel.CONFLATED)
fun main() { println("Channel types created") }

قناة Rendezvous ‏(capacity=0)

هذه هي القناة الافتراضية. يعلّق send التنفيذ حتى يصبح المستقبل جاهزًا، ويعلّق receive التنفيذ حتى يرسل المرسل قيمة. ويلتقي الطرفان عند النقطة نفسها.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>() // rendezvous
    launch {
        println("Sending...")
        ch.send(1)  // suspends until receiver is ready
        println("Sent")
    }
    delay(100)
    println("Receiving...")
    println(ch.receive())
}

قناة مخزنة مؤقتًا

تسمح القناة المخزنة مؤقتًا للمرسل بالاستمرار من دون انتظار حتى يمتلئ المخزن. وعند امتلائه، يعلّق send التنفيذ.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>(3) // buffer of 3
    launch {
        repeat(3) {
            println("Sending $it")
            ch.send(it) // does not suspend until buffer full
        }
        ch.close()
    }
    delay(500)
    for (v in ch) println("Got $v")
}

Channel.BUFFERED

يستخدم Channel.BUFFERED السعة الافتراضية، وهي 64. وهذا يعادل Channel(64).

import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.*
fun main() = runBlocking {
    val ch = Channel<String>(Channel.BUFFERED)
    println("Default buffer capacity is implementation-defined (~64)")
    ch.close()
}

قناة غير محدودة

لا يعلّق Channel.UNLIMITED المرسل أبدًا، بل يخزّن جميع القيم. استخدمه بحذر، إذ قد تزداد الذاكرة المستخدمة بلا حدود.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>(Channel.UNLIMITED)
    launch {
        repeat(1000) { ch.send(it) } // never suspends
        ch.close()
    }
    var sum = 0
    for (v in ch) sum += v
    println("Sum: $sum")
}

قناة متراصة

يحتفظ Channel.CONFLATED بأحدث قيمة فقط. وإذا وصلت قيمة جديدة قبل استقبال القيمة السابقة، تُحذف القيمة القديمة.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>(Channel.CONFLATED)
    launch {
        repeat(5) { ch.send(it) } // 0..4 sent rapidly
        ch.close()
    }
    delay(50) // let all sends happen
    println("Received: ${ch.tryReceive().getOrNull()}") // likely 4 (last)
}

توقيت RENDEZVOUS مقابل BUFFERED

تزامن RENDEZVOUS بين المنتج والمستهلك. أما BUFFERED فيسمح للمنتج بالتقدم، ويفصل بين توقيت الطرفين.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>(Channel.BUFFERED)
    val t = System.currentTimeMillis()
    launch {
        repeat(5) { ch.send(it) } // fast — doesn't wait
        ch.close()
    }
    for (v in ch) { delay(100); println("$v at ${System.currentTimeMillis()-t}ms") }
}

استراتيجية onBufferOverflow

باستخدام Channel(capacity, onBufferOverflow)، اختر ما يحدث عند امتلاء المخزن: SUSPEND، وهو الخيار الافتراضي، أو DROP_OLDEST أو DROP_LATEST.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>(2, BufferOverflow.DROP_OLDEST)
    launch {
        repeat(5) { ch.trySend(it) } // 0,1,2,3,4 — buffer keeps newest 2
        ch.close()
    }
    for (v in ch) println(v) // likely 3 4
}

اختيار نوع Channel

دليل الاختيار: استخدم Rendezvous للمزامنة الوثيقة، وBuffered لزيادة معدل المعالجة، وConflated للاحتفاظ بأحدث قيمة فقط، مثل حالة واجهة المستخدم، وUnlimited لتسجيل الأحداث عندما يكون فقدانها غير مقبول.

import kotlinx.coroutines.channels.Channel
// Use cases:
// RENDEZVOUS  — handshake between producer and consumer
// BUFFERED    — decouple I/O-heavy producer from slow consumer
// CONFLATED   — UI updates (only latest matters)
// UNLIMITED   — audit log (never drop)
fun main() { println("Choose based on your loss tolerance and timing needs") }

Channel في select

يتيح select الانتظار على عدة قنوات في الوقت نفسه، واختيار أول قناة تصبح جاهزة.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*
fun main() = runBlocking {
    val a = produce { delay(100); send("from a") }
    val b = produce { delay(50);  send("from b") }
    val result = select<String> {
        a.onReceive { it }
        b.onReceive { it }
    }
    println(result) // "from b"
    coroutineContext.cancelChildren()
}

قناة المؤقت

ينشئ ticker(delay) قناة تُصدر Unit كل delay من المللي ثانية، وهي مفيدة للاستطلاع المتكرر.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ticker = ticker(delayMillis = 100, initialDelayMillis = 0)
    var count = 0
    for (tick in ticker) {
        println("Tick ${++count}")
        if (count == 3) { ticker.cancel(); break }
    }
}

تحقق سريع

ما نوع القناة الذي يحتفظ بأحدث قيمة فقط؟

مراجعة

Rendezvous: متزامنة ومن دون مخزن مؤقت. Buffered: تفصل بين التوقيتين. Conflated: تحتفظ بأحدث قيمة فقط وتحذف القيم القديمة. Unlimited: لا تعلّق المرسل أبدًا. اختر النوع وفقًا لمدى تقبلك لفقدان القيم وحاجتك إلى معدل المعالجة.

الأسئلة الشائعة

هل درس «أنواع Channel: ‏Rendezvous وBuffered وConflated وUnlimited» مجاني؟

نعم — نص درس «أنواع Channel: ‏Rendezvous وBuffered وConflated وUnlimited» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «أنواع Channel: ‏Rendezvous وBuffered وConflated وUnlimited»؟

اختر نوع Channel المناسب لنمط الاتصال لديك. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «أنواع Channel: ‏Rendezvous وBuffered وConflated وUnlimited»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات Channel: ‏send وreceive وclose
  2. أنواع Channel: ‏Rendezvous وBuffered وConflated وUnlimited
  3. ‏Mutex وSemaphore للحالة المشتركة
  4. Actors وإدارة الحالة المنظّمة
← العودة إلى Kotlin Academy