【问题标题】:grpc-swift: How to set timeout for an RPC in Swift?grpc-swift:如何在 Swift 中为 RPC 设置超时?
【发布时间】:2022-06-11 15:45:17
【问题描述】:

我正在使用https://github.com/grpc/grpc-swift 进行进程间通信。我有一个用 Go 编写的 GRPC 服务器,它侦听一个 unix 域套接字,还有一个用 Swift 编写的 macOS 应用程序,它通过套接字与其通信。

假设 Go 服务器进程未运行,我从 Swift 程序进行 RPC 调用。调用失败前的默认超时时间为 20 秒,但我想将其缩短为 1 秒。我正在尝试做这样的事情:

let callOptions = CallOptions(timeLimit: .seconds(1)) // <-- Does not compile

编译错误类型'TimeLimit' has no member 'seconds'失败。

减少 Swift GRPC 调用超时间隔的正确方法是什么?

【问题讨论】:

    标签: grpc grpc-swift


    【解决方案1】:

    如错误TimeLimit 中所述,没有成员seconds。您尝试访问的这个seconds 函数位于TimeAmount 中。因此,如果您想使用截止日期,则需要使用:

    CallOptions(timeLimit: .deadline(.now() + .seconds(1)))
    

    这里的.nowNIODeadline 内部,它作为+ 运算符定义为与TimeLimit 相加(检查here)。

    超时:

    CallOptions(timeLimit: .timeout(.seconds(1)))
    

    请注意,我不是 Swift 方面的专家,但我查看了 TimeLimitTests.swift,这似乎是我的想法。

    【讨论】:

    • 这也会导致编译错误:“Type 'NIODeadline' has no member 'seconds'”
    • 但是您帖子中的测试链接帮助我找到了解决方案! CallOptions(timeLimit: TimeLimit.timeout(.seconds(1))) 编译并具有所需的行为。如果您更新对此的答案,我会将其标记为正确答案。
    • 注意:超时和截止日期是不同的概念,我建议您检查最适合您的用例的一个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2020-04-25
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多