Получить ссылку на задание сопрограммы в области сопрограммы

#kotlin #coroutine

#kotlin #сопрограмма

Вопрос:

В сопрограмме kotlin большинство стандартных методов построения (например, launch) возвращают ссылку на задание,

заключается ли дизайн в том, чтобы сохранить эти ссылки в чем-то, например, в карте / списке (управление запущенными заданиями «вручную»), или есть способ найти запущенное задание в заданной области?

  scope.launch { /* starting a coroutine in scope */ }
 

есть ли способ позже получить ссылку на запущенную сопрограмму, не сохраняя ссылку на запущенное задание, возвращаемое scope.launch, или мы должны управлять этим самостоятельно (например. сохранить ссылку, возвращаемую при запуске)?

Комментарии:

1. чтобы упростить вопрос, есть ли способ получить все задания, запущенные в области сопрограммы? есть ли способ назначить тег сопрограмме, а затем извлечь его, или этой функции нет? в случае, если требуется вызвать cancel не для всей области, а для нескольких сопрограмм

Ответ №1:

необходимо сохранить ссылку на родительское задание

 val job = Job()
val scope = CoroutineScope(Dispatchers.IO   job)
scope.launch {
    ...
    job.children // this return all jobs started in this scope
}
 

Комментарии:

1. Хорошо, хорошо, спасибо за ответ, но можете ли вы, например, назначить тег заданию, а затем найти в последовательности дочерних элементов? я имею в виду, вы знаете, что запустили конкретное задание в этой области, как вы его вернете? возможно, одним из способов было бы использовать хэш-код для запущенного задания и сохранить его для последующего использования

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

3. это лучший способ. Другой способ — по индексу. Например job.children.elementAt(0) , запущены ли первые дочерние элементы

4. да, я вижу, что нет прямого / простого способа сделать это, и по индексу неясно найти конкретную работу, спасибо