当前位置:嗨网首页>书籍在线阅读

26-通道生产者

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

12.6.3 通道生产者

使用协程生成元素序列的模式非常常见,这种并发代码经常出现在生产者——消费者模式中,可以将这样的生产者抽象为以channel作为参数的函数,该函数的返回结果也是一个函数。

fun main(args: Array<String>) = runBlocking<Unit> {
    val squares = produceSquares()
    squares.consumeEach { println(it) }
    println("Done!")
}
fun produceSquares() = produce<Int> {
    for (x in 1..5) send(x * x)
}

函数中,produce函数的定义如下。

public fun <E> produce(
    context: CoroutineContext,
    capacity: Int = 0,
    block: suspend ProducerScope<E>.() -> Unit
): ProducerJob<E> {
    val channel = Channel<E>(capacity)
    return ProducerCoroutine(newCoroutineContext(context), channel).apply {
        initParentJob(context[Job])
        block.startCoroutine(this, this)
    }
}

produce函数启动一个新的协程,协程发送数据到通道,并生成数据流,同时以ProducerJob对象的形式返回对协程的引用。