В чем разница между CoroutineContext и Job в kotlinx.coroutines?

В библиотеке kotlinx.coroutines все конструкторы coroutine, такие как launch , async и т. Д. Принимают параметр CoroutineContext но также имеют дополнительный parent параметр с типом Job . В чем разница между CoroutineContext и Job ?

Job представляет собой сопрограмму или какую-то совокупную задачу, которая выполняется. Job – это CoroutineContext.Element , что означает, что его можно сохранить в контексте сопрограммы. CoroutineContext представляет собой набор различных элементов контекста coroutine, причем работа является всего лишь одним из таких элементов.

Фактически, контекст coroutine больше похож на карту, так как вы можете использовать ключи элемента coroutine для извлечения из него элементов. Например, если у вас есть значение ctx типа CoroutineContext , вы можете получить задание от него с помощью выражения ctx[Job] . Более подробную информацию можно найти в соответствующем разделе сопроводительного документа coroutines и документации для CoroutineContext .

Когда запускается новая сопрограмма, можно указать полный контекст. Если этот контекст содержит задание, то соответствующее задание становится родителем для новой сопрограммы.

parent параметр для сопроцессоров coroutine, таких как launch является просто удобством для более детальной спецификации родительских заданий. Поскольку в документации для launch подчеркивается, что явно заданное родительское задание имеет приоритет над заданием, которое было указано в контексте. Фактический пример того, как он может быть использован, приведен в этом разделе руководства.