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对象的形式返回对协程的引用。