最近,我试图用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对我来说很难发现,所以我想了解
网袋
功能更深入。因此,我有以下问题:
-
为什么?
网袋
函数不等待附加的协程?这是错误还是故意的决定?
-
关于函数的约定是什么
协同视野
-s?我是否应该始终使用已知的标准库函数(如
协同视野
)? 或者库作者应该遵循一些指导原则吗?例如,总是等待范围内所有附加的协同程序完成?