mirror of
https://github.com/tursom/TursomServer.git
synced 2025-03-14 03:40: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
|
||||
|
||||
class CoroutineScopeContext(
|
||||
var coroutineScope: CoroutineScope
|
||||
var coroutineScope: CoroutineScope = GlobalScope
|
||||
) : CoroutineContext.Element {
|
||||
override val key: CoroutineContext.Key<*> get() = Companion
|
||||
override fun toString(): String = "CoroutineScopeContext(coroutineScope=$coroutineScope)"
|
||||
|
@ -75,3 +75,15 @@ fun <T> CoroutineScope.asyncWithCoroutineLocalAndCoroutineScopeContext(
|
||||
): Deferred<T> {
|
||||
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
|
||||
|
||||
import cn.tursom.core.usingTime
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
val testCoroutineLocal = CoroutineLocal<Int>()
|
||||
@ -8,21 +7,17 @@ val testCoroutineLocalList = Array(100000) {
|
||||
CoroutineLocal<Int>()
|
||||
}.asList()
|
||||
|
||||
fun main() = runBlockingWithCoroutineLocalContext {
|
||||
fun main() = runBlockingWithCoroutineLocalAndCoroutineScopeContext {
|
||||
println(coroutineContext)
|
||||
launchWithCoroutineLocalAndCoroutineScopeContext {
|
||||
CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext {
|
||||
println(coroutineContext)
|
||||
println(CoroutineScopeContext.get())
|
||||
testCoroutineLocal set 0
|
||||
testCoroutineLocal set 0
|
||||
testCoroutineLocalList.forEachIndexed { index, coroutineLocal ->
|
||||
coroutineLocal set index
|
||||
println(Thread.currentThread().name)
|
||||
CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext {
|
||||
println(coroutineContext)
|
||||
println(CoroutineScopeContext.get())
|
||||
println(Thread.currentThread().name)
|
||||
}
|
||||
println(usingTime {
|
||||
repeat(10000000) {
|
||||
testCoroutineLocal.get()
|
||||
}
|
||||
})
|
||||
}.join()
|
||||
delay(1000)
|
||||
println(CoroutineLocal)
|
||||
|
Loading…
Reference in New Issue
Block a user