Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftNIO是否有类似于GCD屏障的机制?_Swift_Grand Central Dispatch_Swift Nio - Fatal编程技术网

SwiftNIO是否有类似于GCD屏障的机制?

SwiftNIO是否有类似于GCD屏障的机制?,swift,grand-central-dispatch,swift-nio,Swift,Grand Central Dispatch,Swift Nio,GCD和SwiftNIO能否共存 请原谅我的无知。这让我感到困惑 推理: 线程过多对性能有害 GCD创建并管理自己的线程 SwiftNIO创建并管理自己的线程 如果您使用许多不同的框架/库,每个框架/库都创建和管理各自的线程,那么最终可能会导致线程过多 我正在努力实现的目标: 我需要同时执行多个独立的任务(由SwiftNIO处理),但偶尔,在所有以前的任务完成后,运行单个串行任务(在这段时间内,SwiftNIO可能会默认使用不同的行为)。GCD为此设置了调度障碍,但据我所知,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中)等待所有可能等待完成的异步任务。屏障模式仅适用于完全同步工作