【问题标题】:Don't exit Kotlin program while several coroutines are running不要在多个协程运行时退出 Kotlin 程序
【发布时间】:2018-06-15 22:27:02
【问题描述】:

在我的程序的几个点,我使用launch 来启动一个执行一些后台任务的协程。然后,在某个时候,我从main 函数返回。我的程序的简化版本可能如下所示:

fun main(args : Array<String>)
{
    launch {
        delay(10000) // some long running operation
        println("finished")
    }
}

现在,协程按预期启动并开始运行操作 - 然后程序退出。如果我不从main 返回或将launch 替换为thread,则一切正常。 那么我该怎么做,鉴于我没有跟踪在我的程序中启动的所有协程(因此我不能使用 .join().await()),确保所有协程都完成在我的程序退出之前?

【问题讨论】:

    标签: kotlin coroutine kotlinx.coroutines


    【解决方案1】:

    鉴于我没有跟踪在我的程序中启动的所有协程(因此我不能使用 .join() 或 .await()),那么我该如何确保所有协程在我的程序退出之前完成?

    您需要在某个时间跟踪并等待结果,以便确定这些协程已经完成。那是因为“协程就像守护线程”:

    Active coroutines do not keep the process alive. They are like daemon threads.

    常规 Java Threads 不是这种情况,默认情况下是 non-daemon

    【讨论】:

    • 不,当我退出主要方法时,java 线程继续在后台运行
    • 对不起,我走错路了,你是对的,这些线程是非守护进程
    • 所以基本上如果我可以告诉协程在这样的线程上运行它们不应该被终止 - 但我的理解是launch,除非另有说明,否则在幕后使用ForkJoinThreadPool
    • 这是一个间接连接,通过协程上下文的可选设施。但是,是的,如果您启动显式执行器服务并将其用作协程的上下文,您的应用程序将继续运行,直到您显式关闭该执行器或执行器本身决定停止线程。 cachedThreadPool 将在空闲 60 秒后自动停止线程。
    • 因此,即使您这样设置,您的应用程序也不会等待协程,而是等待执行器服务的线程完成。根据具体情况,它们可能永远不会完成,甚至可能比您的协程更早完成(例如,如果协程在没有计划恢复的情况下被挂起)。
    猜你喜欢
    • 2019-12-18
    • 2021-02-23
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多