mirror of
https://github.com/tursom/TursomServer.git
synced 2025-03-22 23:50:06 +08:00
add CoroutineScopeContext
This commit is contained in:
parent
a9137789db
commit
9b80eabdf0
@ -6,7 +6,7 @@ import kotlin.coroutines.CoroutineContext
|
|||||||
import kotlin.coroutines.coroutineContext
|
import kotlin.coroutines.coroutineContext
|
||||||
|
|
||||||
class CoroutineScopeContext(
|
class CoroutineScopeContext(
|
||||||
var coroutineScope: CoroutineScope
|
var coroutineScope: CoroutineScope = GlobalScope
|
||||||
) : CoroutineContext.Element {
|
) : CoroutineContext.Element {
|
||||||
override val key: CoroutineContext.Key<*> get() = Companion
|
override val key: CoroutineContext.Key<*> get() = Companion
|
||||||
override fun toString(): String = "CoroutineScopeContext(coroutineScope=$coroutineScope)"
|
override fun toString(): String = "CoroutineScopeContext(coroutineScope=$coroutineScope)"
|
||||||
|
@ -75,3 +75,15 @@ fun <T> CoroutineScope.asyncWithCoroutineLocalAndCoroutineScopeContext(
|
|||||||
): Deferred<T> {
|
): Deferred<T> {
|
||||||
return async(context + CoroutineLocalContext(map) + CoroutineScopeContext(this), start, block)
|
return async(context + CoroutineLocalContext(map) + CoroutineScopeContext(this), start, block)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Throws(InterruptedException::class)
|
||||||
|
fun <T> runBlockingWithCoroutineLocalAndCoroutineScopeContext(
|
||||||
|
context: CoroutineContext = EmptyCoroutineContext,
|
||||||
|
map: MutableMap<CoroutineLocal<*>, Any?> = HashMap(4),
|
||||||
|
block: suspend CoroutineScope.() -> T
|
||||||
|
): T {
|
||||||
|
return runBlocking(context + CoroutineLocalContext(map) + CoroutineScopeContext()) {
|
||||||
|
CoroutineScopeContext set this
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package cn.tursom.utils.coroutine
|
package cn.tursom.utils.coroutine
|
||||||
|
|
||||||
import cn.tursom.core.usingTime
|
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
|
||||||
val testCoroutineLocal = CoroutineLocal<Int>()
|
val testCoroutineLocal = CoroutineLocal<Int>()
|
||||||
@ -8,21 +7,17 @@ val testCoroutineLocalList = Array(100000) {
|
|||||||
CoroutineLocal<Int>()
|
CoroutineLocal<Int>()
|
||||||
}.asList()
|
}.asList()
|
||||||
|
|
||||||
fun main() = runBlockingWithCoroutineLocalContext {
|
fun main() = runBlockingWithCoroutineLocalAndCoroutineScopeContext {
|
||||||
println(coroutineContext)
|
println(coroutineContext)
|
||||||
launchWithCoroutineLocalAndCoroutineScopeContext {
|
CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext {
|
||||||
println(coroutineContext)
|
println(coroutineContext)
|
||||||
println(CoroutineScopeContext.get())
|
println(CoroutineScopeContext.get())
|
||||||
testCoroutineLocal set 0
|
println(Thread.currentThread().name)
|
||||||
testCoroutineLocal set 0
|
CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext {
|
||||||
testCoroutineLocalList.forEachIndexed { index, coroutineLocal ->
|
println(coroutineContext)
|
||||||
coroutineLocal set index
|
println(CoroutineScopeContext.get())
|
||||||
|
println(Thread.currentThread().name)
|
||||||
}
|
}
|
||||||
println(usingTime {
|
|
||||||
repeat(10000000) {
|
|
||||||
testCoroutineLocal.get()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}.join()
|
}.join()
|
||||||
delay(1000)
|
delay(1000)
|
||||||
println(CoroutineLocal)
|
println(CoroutineLocal)
|
||||||
|
Loading…
Reference in New Issue
Block a user