SwiftNIO是否有类似于GCD屏障的机制?
GCD和SwiftNIO能否共存 请原谅我的无知。这让我感到困惑 推理:SwiftNIO是否有类似于GCD屏障的机制?,swift,grand-central-dispatch,swift-nio,Swift,Grand Central Dispatch,Swift Nio,GCD和SwiftNIO能否共存 请原谅我的无知。这让我感到困惑 推理: 线程过多对性能有害 GCD创建并管理自己的线程 SwiftNIO创建并管理自己的线程 如果您使用许多不同的框架/库,每个框架/库都创建和管理各自的线程,那么最终可能会导致线程过多 我正在努力实现的目标: 我需要同时执行多个独立的任务(由SwiftNIO处理),但偶尔,在所有以前的任务完成后,运行单个串行任务(在这段时间内,SwiftNIO可能会默认使用不同的行为)。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
,现在假设您希望同时运行myOperation
100次,然后打印“Hello World!”一旦他们都成功了。在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!")
}
//生成`myOperation` 100次,数组将包含100个未来,其中
//将包含100次运行“myOperation”的结果(或失败)。
让hundredOps=(0..有趣!在GCD中,声明屏障的调用站点是解耦的,不需要知道以前声明的任何任务(queue.async(flags:.barrier){print(“全部完成!”)}
。使用SwiftNIO是否也能严格做到这一点?从您的示例中,我了解到您需要事先知道任务:。并且都会成功(taskstobeforehand)
顺便说一句,阅读得很好!感谢您的详细说明。SwiftNIO在GCD中不做“并发队列”(在GCD中,它们大部分不再被推荐)。好吧,SwiftNIO在GCD中不做“并发队列”(在GCD中,它们大部分不再被推荐)。如果你没有并发队列,屏障什么也不做,所以严格地说,屏障调度的等价物只是eventLoop.execute{code}。但不会(在GCD或NIO中)等待所有可能等待完成的异步任务。屏障模式仅适用于完全同步工作