如何使用 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 协程返回树的所有节点?

要有效地解决这个问题,您应该:

  1. 解析rootRef: NodeReference得到一个rootNode: Node
  2. rootNode
  3. 的所有 children 递归异步调用 nodeList 方法
  4. 等待结果
  5. 合并结果并向其中添加 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) }