Linux 中的异步 Swift 处理不工作

Asynchronous Swift processing in Linux not working

我正在尝试了解 Swift 4.0 异步处理在 Linux 中的工作原理。

在查看了 SO 上的 documentation and some 之后,我想到了这个简单的例子:

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!?我错过了什么?如何编写一个简单的并行处理示例?

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

Executes blocks submitted to the main queue

示例:

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    print("Done!")
    exit(0)
}

print("Starting main event loop...")
dispatchMain()

我认为问题出在使用 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...

Dispatch 不是抢先的。提交到非并发队列的块将按顺序处理,并且在它们之前的块完成之前不会处理任何块。你把你的block放在main队列中,它对应于主线程,但是,主线程一直忙着休眠直到它退出,并且永远没有机会做dispatch queue工作。

Martin R 提到了 dispatchMain,尽管另一个选项是 RunLoop.main.run(mode: .defaultRunLoopMode, before: .distantFuture),它只会 运行 运行 循环一次,允许程序随后退出。