web-dev-qa-db-fra.com

Différence entre CoroutineScope et coroutineScope dans Kotlin

Quelqu'un peut-il clarifier les fonctions CoroutineScope() et coroutineScope()?

Quand j'ai essayé de vérifier la source, j'ai trouvé que les deux étaient des fonctions de CoroutineScope.kt. De plus, coroutineScope() est suspend fonction tandis que l'autre est normal function

Voici la documentation que j'ai pu trouver:

/**
 * Creates a [CoroutineScope] that wraps the given coroutine [context].
 *
 * If the given [context] does not contain a [Job] element, then a default `Job()` is created.
 * This way, cancellation or failure or any child coroutine in this scope cancels all the other children,
 * just like inside [coroutineScope] block.
 */
@Suppress("FunctionName")
public fun CoroutineScope(context: CoroutineContext): CoroutineScope =
    ContextScope(if (context[Job] != null) context else context + Job())

Et

/**
 * Creates a [CoroutineScope] and calls the specified suspend block with this scope.
 * The provided scope inherits its [coroutineContext][CoroutineScope.coroutineContext] from the outer scope, but overrides
 * the context's [Job].
 *
 * This function is designed for _parallel decomposition_ of work. When any child coroutine in this scope fails,
 * this scope fails and all the rest of the children are cancelled (for a different behavior see [supervisorScope]).
 * This function returns as soon as the given block and all its children coroutines are completed.
 * A usage example of a scope looks like this:
 *
 * ```
 * suspend fun showSomeData() = coroutineScope {
 *
 *   val data = async(Dispatchers.IO) { // <- extension on current scope
 *      ... load some UI data for the Main thread ...
 *   }
 *
 *   withContext(Dispatchers.Main) {
 *     doSomeWork()
 *     val result = data.await()
 *     display(result)
 *   }
 * }
 * ```
 *
 * The scope in this example has the following semantics:
 * 1) `showSomeData` returns as soon as the data is loaded and displayed in the UI.
 * 2) If `doSomeWork` throws an exception, then the `async` task is cancelled and `showSomeData` rethrows that exception.
 * 3) If the outer scope of `showSomeData` is cancelled, both started `async` and `withContext` blocks are cancelled.
 * 4) If the `async` block fails, `withContext` will be cancelled.
 *
 * The method may throw a [CancellationException] if the current job was cancelled externally
 * or may throw a corresponding unhandled [Throwable] if there is any unhandled exception in this scope
 * (for example, from a crashed coroutine that was started with [launch][CoroutineScope.launch] in this scope).
 */
public suspend fun <R> coroutineScope(block: suspend CoroutineScope.() -> R): R =
    suspendCoroutineUninterceptedOrReturn { uCont ->
        val coroutine = ScopeCoroutine(uCont.context, uCont)
        coroutine.startUndispatchedOrReturn(coroutine, block)
    }

Je veux avoir une différence claire entre eux. Si quelqu'un peut répondre quand utiliser lequel, ce serait utile.

5
Kushal

Dans l'exemple de concurrence non structurée, si vous remplacez le générateur de lancement par Async et attendez sur le différé, cela fonctionnera de la même manière que l'exemple que vous avez utilisé dans la concurrence structurée. Votre réponse n'est toujours pas claire. Expliquer l'utilisation réelle de l'accès concurrentiel structuré (ce qui est utile dans la gestion des exceptions et des erreurs, lorsque l'un des Job enfant lève une exception, ce qui ne devrait pas affecter les autres enfants (Jobs))

0
parvez rafi