gpt4 book ai didi

kotlin - 如何使协程从外部调用按顺序运行

转载 作者:行者123 更新时间:2023-12-02 12:41:35 25 4
gpt4 key购买 nike

我是协程及其工作原理方面的新手,我已经阅读了很多相关内容,但我似乎无法理解如何或是否可以实现我的最终目标。

我会尽可能详细地解释。无论如何,这是我的目标:

确保在调用具有协程的方法时协程按顺序运行。

我已经创建了一个符合我希望发生的情况的测试:

class TestCoroutines {

@Test
fun test() {
println("Starting...")

runSequentially("A")
runSequentially("B")

Thread.sleep(1000)
}

fun runSequentially(testCase: String) {
GlobalScope.launch {
println("Running test $testCase")
println("Test $testCase ended")
}
}
}

重要说明:我无法控制某人将调用 runSequentially 函数的次数。但我想保证它会按顺序调用。

此测试运行以下输出:

Starting...
Running test B
Running test A
Test A ended
Test B ended

Starting...
Running test A
Running test B
Test B ended
Test A ended

This is the output I want to achieve :
Starting...
Running test A
Test A ended
Running test B
Test B ended

我想我明白为什么会这样:每次我调用 runSequentially 时,我都会创建一个新的 Job,它正在运行,并且异步运行。

是否有可能使用协程来保证它们只会在前一个(如果它正在运行)完成之后运行,而我们无法控制调用协程的次数?

最佳答案

您正在寻找的是对请求进行排序的队列和为请求提供服务的工作程序的组合。简而言之,您需要一个 Actor :

private val testCaseChannel = GlobalScope.actor<String>(
capacity = Channel.UNLIMITED
) {
for (testCase in channel) {
println("Running test $testCase")
println("Test $testCase ended")
}
}

fun runSequentially(testCase: String) = testCaseChannel.sendBlocking(testCase)

关于kotlin - 如何使协程从外部调用按顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55456660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com