首页 文章

Linux中的异步Swift处理无法正常工作

提问于
浏览
2

我试图了解Swift 4.0异步处理在Linux中是如何工作的 .

在看了documentation和一些answers之后我想出了这个简单的例子:

import Dispatch
import Glibc

DispatchQueue.main.asyncAfter(deadline: .now()) {
    print("Done!")
}

print("Sleeping for 2 seconds...")
usleep(2 * 1_000_000)

print("Exiting...")

但是,这只打印:

Sleeping for 2 seconds...
Exiting...

为什么不打印 Done! ?我错过了什么?如何编写简单的并行处理示例?

3 回答

  • 1

    你必须调用dispatchMain()来启动GCD事件循环:

    执行提交到主队列的块

    例:

    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        print("Done!")
        exit(0)
    }
    
    print("Starting main event loop...")
    dispatchMain()
    
  • 0

    我认为问题是使用 main 队列 . 如果我改为创建一个新队列,它会按预期工作 .

    import Dispatch
    import Glibc
    
    DispatchQueue(label: "worker").asyncAfter(deadline: .now()) {
        print("Doing work...")
        usleep(1 * 1_000_000)
        print("Work done")
    }
    
    print("Sleeping for 2 seconds...")
    usleep(2 * 1_000_000)
    
    print("Exiting...")
    

    打印出预期结果:

    Sleeping for 2 seconds...
    Doing work...
    Work done!
    Exiting...
    
  • 0

    派遣不是先发制人的 . 提交到非并发队列的块将按顺序处理,并且在它们完成之前的块之前不会处理任何块 . 您将块放在 main 队列上,该队列对应于主线程,但是,主线程正忙着睡觉直到它退出,并且永远不会有机会执行调度队列工作 .

    Martin R提到 dispatchMain ,虽然另一个选项是RunLoop.main.run(mode: .defaultRunLoopMode, before: .distantFuture),它只会运行一次runloop,允许程序在之后退出 .

相关问题