微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftNIO 有类似 GCD 屏障的机制吗?

如何解决SwiftNIO 有类似 GCD 屏障的机制吗?

GCD 和 SwiftNIO 可以共存吗?

请原谅我的无知。这让我很困惑。

推理:

  • 线程过多不利于性能
  • GCD 创建并管理自己的线程;
  • SwiftNIO 创建并管理自己的线程;
  • 如果您使用许多不同的框架/库,每个框架/库都创建和管理各自的线程,则最终可能会有太多线程;

我正在努力实现的目标:

我需要同时发生多个独立的任务(由 SwiftNIO 处理),但偶尔,一旦所有先前的任务都完成,运行单个串行任务(并且在此期间可能认为 SwiftNIO 的不同行为)。为此,GCD 具有调度障碍,但据我所知,SwiftNIO 没有类似的机制。

解决方法

是的,SwiftNIO 和 GCD 绝对可以共存。

SwiftNIO 是一个非阻塞和异步网络框架,因此您可以在非常少的线程上运行任意数量的任务/网络连接/...。

事实上,你可以在 1 个线程上运行任何正确的 SwiftNIO 程序(如果你愿意,它甚至可以是主线程)并且它会工作得很好。甚至允许 SwiftNIO 使用多个线程的唯一原因是利用您无论如何都要支付的 CPU 资源。例如,假设您正在实施一个应该同时处理 100,000 个连接的网络服务器,并且您的机器有 4 个 CPU。您可以在一个线程上完全处理所有这 100,000 个连接,并且程序可以正常工作,但您只能使用四个可用内核中的一个。这会使程序不必要地变慢,并浪费四个 CPU 内核。在这个例子中,我建议使用 4 个线程生成一个 EventLoopGroup,然后 100,000 个连接将在四个循环中循环,这意味着每个循环(因此线程)应该获得大约 25,000 个连接和您有机会使用所有可用的硬件资源。

关于在其他一些操作成功后何时触发一个操作的另一个问题:使用 SwiftNIO 时,您的操作可能类似于 func myOperation() -> EventLoopFuture<Void>,现在假设您想运行 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!")
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?