我试图了解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 回答
你必须调用dispatchMain()来启动GCD事件循环:
例:
我认为问题是使用
main
队列 . 如果我改为创建一个新队列,它会按预期工作 .打印出预期结果:
派遣不是先发制人的 . 提交到非并发队列的块将按顺序处理,并且在它们完成之前的块之前不会处理任何块 . 您将块放在
main
队列上,该队列对应于主线程,但是,主线程正忙着睡觉直到它退出,并且永远不会有机会执行调度队列工作 .Martin R提到
dispatchMain
,虽然另一个选项是RunLoop.main.run(mode: .defaultRunLoopMode, before: .distantFuture),它只会运行一次runloop,允许程序在之后退出 .