首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在部署在OpenShift中的容器中运行多个协程

在部署在OpenShift中的容器中运行多个协程
EN

Stack Overflow用户
提问于 2021-09-02 10:13:59
回答 1查看 98关注 0票数 1

我将以下Kotlin代码部署为OpenShift中的容器:

代码语言:javascript
复制
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@kotlin.jvm.JvmOverloads
fun Application.module() {

    launch { consumeProductionGeneratingUnits1hTopic() }
    launch { consumeProductionLargeGeneratingUnits1hTopic() }
    launch { consumeProductionAggregateProdType1hTopic() }

}

每个协程都只是在无限循环中使用kafka主题:

代码语言:javascript
复制
fun runCoroutine() {
    val consumer = buildConsumer("topic")
    while (true){
        val record = consumer.poll(Duration.ofSeconds(30))
        println(record.toString())
    }
}

当我在本地运行这段代码时,所有三个协程都会启动。但是,当我在OpenShift中将代码作为容器部署和运行时,只启动了前两个协程。看起来OpenShift最多支持两个协程。

有没有人经历过类似的事情?我尝试为正在运行的pod预留更多的cpu,但这并不影响协程的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-02 11:35:08

首先要注意的是,您没有使用挂起函数,因此这些协程将使用它们的while(true)循环永远阻塞它们正在运行的线程。协程被设计成协作式的,所以你需要挂起点来允许线程切换。

在当前的实现中,如果你在一个只有2个线程的线程池上调度,前两个协程将阻塞它们,第三个协程将永远不会运行。一些协程调度程序使用许多线程,这些线程依赖于可用核心的数量,这可以解释本地计算机(可能超过2个核心)和容器(可能2个核心)之间的行为差异。

我不能断定您是否在包含2个以上线程的线程池中分派这些协程,因为您没有显示launch它们的协程作用域(您的代码不应该按原样编译,除非您使用的是带有没有CoroutineScope接收器的顶级launch的非常旧版本的协程?)。

解决方案

当然,您可以为pod分配更多的内核,但这只是在推动问题。

另一种选择是使用具有更多线程的线程池,但这也是在推动问题。

正确的修复方法是实际使用转换为suspend函数的异步API。但一个更简单(快速)的修复方法是保持代码的原样,但只需在循环中添加一个对yield()的调用,以确保线程不时被释放以供其他协程使用:

代码语言:javascript
复制
suspend fun runCoroutine() {
    val consumer = buildConsumer("topic")
    while (true){
        val record = consumer.poll(Duration.ofSeconds(30))
        println(record.toString())
        yield() // ensures we suspend to free the thread
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69028291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档