如何使用 Kotlin 协同程序抓取递归结构?
How to crawl recursive structures using Kotlin coroutines?
给定一个树状结构,并且
获取 children 的操作
节点的,例如:
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
- 为
rootNode
的所有 children
递归异步调用 nodeList
方法
- 等待结果
- 合并结果并向其中添加
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) }
给定一个树状结构,并且 获取 children 的操作 节点的,例如:
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
- 为
rootNode
的所有 - 等待结果
- 合并结果并向其中添加
rootNode
children
递归异步调用 nodeList
方法
以下是您的操作方法:
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) }