Kotlin: получить текущий CoroutineContext.Key без доступа к CoroutineScope? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь перехватить операторы печати System.out, и в многопоточной программе я планирую добавить их на карту, используя CoroutineContext.Key в качестве ключа карты, так что я знаю, к какой подпрограмме относится вывод к.

Мои выполняемые дочерние методы не имеют доступа к CoroutineScope, так как это было запущено для родительского метода.

Я надеялся на статический метод, аналогичный CoroutineContext.currentKey, но это не похоже на то, что он существует.

Я добился подобного в C #, используя их Task.CurrentId

Есть ли способ для меня, чтобы достичь этого?

Спасибо

1 Ответ

0 голосов
/ 25 января 2019

Вы можете создать свою собственную локальную переменную потока, чтобы сохранить собственный идентификатор сопрограммы или даже непосредственно ее сохраненный вывод, и использовать функцию расширения ThreadLocal.asContextElement() для преобразования ее в элемент контекста сопрограммы. Теперь, если вы запустите свою сопрограмму с этим элементом, то указанное значение этой локальной переменной потока будет автоматически установлено в соответствующую локальную переменную потока, поскольку эта сопрограмма переходит от потока к потоку. Смотрите следующий пример кода:

import kotlinx.coroutines.*

val myId = ThreadLocal<String>()

// I'm not a suspending function, yet I know what coroutine I work in
fun whereAmI() {
    println("I'm in coroutine '${myId.get()}'")
}

fun main() = runBlocking<Unit> {
    launch(myId.asContextElement("First")) {
        whereAmI()
    }
    launch(myId.asContextElement("Second")) {
        whereAmI()
    }
}
...