代码之家  ›  专栏  ›  技术社区  ›  Tony Lin

如何监控递归调度队列的任务何时全部完成?

  •  0
  • Tony Lin  · 技术社区  · 6 年前

    通常我可以用 DispatchGroup 跟踪多个调度任务中的任务。但是为了确保 调度组 如果工作正常 group.notify 方法必须在所有 group.enter 所有的 task s。

    现在的问题是,我有一个递归,它在递归中创建了更多 任务 tasks 已完成。正如我前面提到的 DispatchGroup.notify 如果它的调用时间早于所有的 组.回车 . 在这种递归情况下,您将不知道什么时候是最后一个 打电话。

    简单示例:

    func findPath(node: Node) {
      if !node.isValid { return }
      queue.async { //concurrent queue
        findPath(node.north)
      }
      queue.async {
        findPath(node.west)
      }
      queue.async {
        findPath(node.south)
      }
      queue.async {
        findPath(node.east)
      }
    }
    

    findPath 本例中的函数是否完全由调度队列中的所有任务完成?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Paulw11    6 年前

    与调度组.通知直到最后一刻才打来调度组请假是叫,所以你叫 enter 外部 leave 里面

    比如:

    func findPath(node: Node) {
      if !node.isValid { return }
      dispatchGroup.enter()
      queue.async { //concurrent queue
        findPath(node.north)
        dispatchGroup.leave()
      }
    
      dispatchGroup.enter()
      queue.async {
        findPath(node.west)
        dispatchGroup.leave()
      }
    
      dispatchGroup.enter()
      queue.async {
        findPath(node.south)
        dispatchGroup.leave()
      }
    
      dispatchGroup.enter()
      queue.async {
        findPath(node.east)
        dispatchGroup.leave()
      }
    }
    
    
    func findPaths(startNode: Node) {
        findPath(node: startNode)
        dispatchGroup.notify {
            print("All done")
        }
    }