我应该在 Swift NIO 中使用哪个事件循环?

joe*_*els 5 swift swift-nio

文档中的示例显示了对 EventLoop现有引用,用于创建未来。

func getNetworkData(args) -> EventLoopFuture<NetworkResponse> {
    let promise = eventLoop.makePromise(of: NetworkResponse.self)
    queue.async {
        . . . do some work . . .
        promise.succeed(response)
        . . . if it fails, instead . . .
        promise.fail(error)
    }
    return promise.futureResult
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我无权访问当前的 EventLoop。有没有一种简单的方法可以访问它?

或者,我可以访问 EventLoopGroup,并且可以使用它services.lambda.client.eventLoopGroup.next()来获取 EventLoop。但这会产生额外的开销吗?我应该寻找现有的 EventLoop 吗?

Rob*_*Mac 2

你的问题里有很多疑问。所以我将回答我认为的主要问题:

我无权访问当前的 EventLoop。有没有一种简单的方法可以访问它?

您可以按如下方式初始化 EventLoopGroup,每个应用程序只需要一个。另外,根据您的使用情况,您通常可能只在numberOfThreads中使用 1 个线程,或者对于大量使用,请使用System.coreCount,它将使用所有可用的核心。

import NIO

let eventGroup = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
Run Code Online (Sandbox Code Playgroud)

此时.next()会生成一个 eventLoop 供您使用,当您的 future 完成时,它会返回以供共享重用。

在应用程序结束时,您可以按如下方式关闭:

try eventGroup.syncShutdownGracefully()
Run Code Online (Sandbox Code Playgroud)

关于此的一些注意事项:

  1. 如果您使用的是Vapor等框架,该框架已经为您设置了 eventGroup。使用他们自己的,他们会为您进行设置和关闭。

  2. 您提到services.lambda.client.eventLoopGroup.next(),所以您可能正在使用 AWS Lambda?我不熟悉它,但如果他们提供循环组,如第 1 点所示,请改用它。