代码之家  ›  专栏  ›  技术社区  ›  Nikita Sivukhin

Kotlin ktor库不必等待websockets处理程序中的所有协同程序完成

  •  0
  • Nikita Sivukhin  · 技术社区  · 2 年前

    最近,我试图用Kotlin和 ktor 图书馆我的服务器只有一个web套接字处理程序,我实现如下:

    embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
        install(WebSockets)
        routing {
            webSocket("/handle") {
                // ... more domain specific logic which uses coroutines ...
                launch {
                    for (message in incoming) {
                        // process message
                    }
                }
            }
        }
    }
    

    原始代码包含更多的逻辑,包括启动一系列其他协同程序——所以 launch -把 incoming 在单独的协同程序中处理队列对我来说并不奇怪。

    不幸的是 ktor 内部块功能完成后,立即关闭基础web套接字连接。这对我来说是出人意料的行为,因为我认为 webSocket 函数的行为类似于 coroutineScope 标准函数,它在继续执行之前等待所有连接的协程完成。

    这个bug对我来说很难发现,所以我想了解 网袋 功能更深入。因此,我有以下问题:

    1. 为什么? 网袋 函数不等待附加的协程?这是错误还是故意的决定?
    2. 关于函数的约定是什么 协同视野 -s?我是否应该始终使用已知的标准库函数(如 协同视野 )? 或者库作者应该遵循一些指导原则吗?例如,总是等待范围内所有附加的协同程序完成?
    0 回复  |  直到 2 年前
        1
  •  1
  •   Aleksei Tirman    2 年前
    1. 这种行为在很久以前就已经实现了,没有任何限制 structured concurrency 记住。我得说这是一个 问题 这可以在Ktor侧修复,所以我创建了 this issue 来解决这个问题。修复将使编写Websocket处理程序变得更容易,并将提高可读性。
    2. 这取决于库维护人员是否考虑为特定情况支持结构化并发。