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)
,它只会 运行 运行 循环一次,允许程序随后退出。
我正在尝试了解 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)
,它只会 运行 运行 循环一次,允许程序随后退出。