我正在开发一个去中心化网络 Android 应用程序。有多个服务器,我需要找到对网络调用响应最快的服务器。这看起来很容易,但出奇的困难。感谢任何使用 Kotlin 解决问题的帮助。
Gemini 提供的当前代码,不幸的是无法返回@coroutineScope。这是编译器不允许的。 return@await 是允许的,但它不会脱离协程作用域,因此所有协程都会被等待。可能需要 10 秒。
suspend fun getAccessibleIP(ipList: List<String>): String? = coroutineScope {
val deferreds = ipList.filter { isValidPublicIpAddress(it) }.map { ip ->
Timber.tag("getAccessibleIP").d("trying $ip")
async {
try {
HproseInstance.isAccessible(ip)
} catch (e: Exception) {
null
}
}
}
try {
withTimeoutOrNull(2000L) {
select<String?> {
deferreds.forEach { deferred ->
deferred.onAwait { res ->
if (res != null) {
// Cancel remaining deferred values and return the result
deferreds.forEach { it.cancel() }
return@coroutineScope res // Exit coroutineScope and return res
} else {
null
}
}
}
}
}
} finally {
// Ensure all coroutines are cancelled if the function exits
deferreds.forEach { it.cancel() }
}
}
最简单的惯用语是
return channelFlow {
ipList.filter { isValidPublicIpAddress(it) }.map { ip ->
Timber.tag("getAccessibleIP").d("trying $ip")
launch {
try {
send(HproseInstance.isAccessible(ip))
} catch (e: Exception) {
// do nothing, I guess?
}
}
}
}.firstOrNull()