GCD和SwiftNIO能共存吗?
原谅我的无知。这让我很困惑。
推理:
- 线程过多会影响性能
- GCD创建并管理自己的线程
- SwiftNIO创建并管理自己的线程
- 如果您使用许多不同的框架/库,每个框架/库都创建和管理各自的线程,那么最终可能会导致线程过多
我正在努力实现的目标:
我需要同时执行多个独立的任务(由SwiftNIO处理(,但偶尔,一旦之前的所有任务都完成了,就运行一个串行任务(在那段时间里,SwiftNIO可能会默认为不同的行为(。GCD为此目的有调度障碍,但据我所知,SwiftNIO没有类似的机制。
是的,SwiftNIO和GCD绝对可以共存。
SwiftNIO是一个非阻塞和异步网络框架,因此您可以运行任意数量的任务/网络连接/。。。在极少数线程上。
事实上,你可以在一个线程上运行任何正确的SwiftNIO程序(如果你选择的话,它甚至可以是主线程(,它会很好地工作。允许SwiftNIO使用多个线程的唯一原因是无论如何都要利用您支付的CPU资源。例如,假设您正在实现一个网络服务器,该服务器应该同时处理100000个连接,并且您的机器有4个CPU。你可以在一个线程上完全处理所有100000个连接,程序会很好地工作,但你只需要使用四个可用核心中的一个。这会使程序变得不必要地慢,并浪费四个CPU核心。在这个例子中,我建议生成一个具有4个线程的EventLoopGroup
,然后100000个连接将在四个循环中循环,这意味着每个循环(以及线程(应该获得大约25000个连接,并且您有机会使用所有可用的硬件资源。
关于您的另一个问题,即在许多其他操作成功后,何时触发一个操作:当使用SwiftNIO时,您的操作可能看起来像func myOperation() -> EventLoopFuture<Void>
,现在假设您希望同时运行myOperation
100次,然后打印";你好,世界"一旦他们都成功了。在NIO中,你将如何做到这一点:
// Spawn `myOperation` 100 times, the array will contain 100 futures which
// will contain the result (or failure) of the 100 runs of `myOperation`.
let hundredOps = (0..<100).map { _ in
myOperation()
}
// Now we do the "barrier":
EventLoopFuture<Void>
// using `andAllSucceed` we create one future
// that will be fulfilled when all of the 100 futures from above are succeeded.
.andAllSucceed(hundredOps, on: eventLoop)
// And once that "overall future" is succeeded, we print "Hello World!"
.whenSuccess {
print("Hello World!")
}