kotlin - 如何使用 Kotlin 协程抓取递归结构?
问题描述
给定一个树状结构,以及一个获取节点子节点的操作,例如:
typealias NodeReference = URL
data class Node(
val data:Data,
val childrenList:List<NodeReference>)
suspend fun resolve(nodeRef:NodeReference) : Node
你知道实现具有签名的爬虫功能的蓝图吗
fun nodeList(rootNode:NodeReference) : List<Node> =
runBlocking(...) {
...
}
使用 Kotlin 协程返回树的所有节点?
解决方案
为了有效地解决这个问题,你应该:
- 决心
rootRef: NodeReference
得到一个rootNode: Node
- 递归异步调用
nodeList
所有children
的方法rootNode
- 等待结果
- 合并结果并将其添加
rootNode
到它们
您可以这样做:
suspend fun nodesList(rootRef: NodeReference): List<Node> = coroutineScope {
val rootNode = resolve(rootRef) // 1
rootNode.childrenList
.map { async { nodesList(it) } } // 2
.awaitAll() // 3
.flatten() + rootNode // 4
}
如果要使用当前线程执行nodesList
,可以如下操作:
fun nodesListBlocking(rootRef: NodeReference): List<Node> = runBlocking { nodesList(rootRef) }
推荐阅读
- c# - 用c#更改资源文件(resx文件)
- rust - 参考上的 Rust 调用方法
- c++ - cpp上一个简单函数的返回值问题
- c++ - 为什么我的程序报告不正确的时差?
- azure-devops - 部署作业中的变量不会扩展值
- maven - “grails clean”报告“需要 HTTPS (501)”
- http2 - 服务端如何识别HTTP2中不同客户端的header压缩
- amazon-web-services - 如何使用 Terraform 查找 AWS Lambda 名称服务器?
- dialogflow-es - 有没有办法只提取参数而不是实体?
- linux - .asoundrc 网络摄像头的 ALSA 配置