¿Por qué iba yo a querer usar Kotlin corrutinas?

Parece que RxKotlin biblioteca es mucho más versátil.
Kotlin corrutinas se ve significativamente menos potente, y más engorroso de utilizar en comparación.

Yo baso mi opinión en corrutinas en este diseño hable por Andrey Breslav (JetBrains): https://www.youtube.com/watch?v=4W3ruTWUhpw

Presentación de diapositivas de la charla es accesible aquí: https://www.slideshare.net/abreslav/jvmls-2016-coroutines-in-kotlin


EDICIÓN (gracias a @tecla de acceso rápido):

Mejor fuente sobre el estado actual de corrutinas: https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md

InformationsquelleAutor charlie_pl | 2017-02-06

3 Comentarios

  1. 71

    Hay dos partes en Rx; de la observación del patrón, y un sólido conjunto de operadores para manipular, transformar y combinar. De la observación del patrón, por sí mismo, no hace mucho. Mismo con Corrutinas; es sólo otro paradigma para lidiar con el asincronismo. Usted puede comparar los pro y los contras de las devoluciones de llamada, Observable y co-rutinas para resolver un problema determinado, pero no se puede comparar un paradigma con una completa biblioteca. Es como comparar un idioma con un marco.

    Cómo Kotlin corrutinas son mejores que RxKotlin ? No solía corrutinas, pero es un aspecto similar a async/esperar en C#. Usted acaba de escribir código secuencial, todo es tan fácil como escribir código sincrónico … excepto que ejecutar de forma asincrónica. Es más fácil de entender.

    ¿Por qué iba yo a querer usar kotlin corrutinas ? Yo le responderé por mí mismo. La mayoría del tiempo que voy a seguir para Rx, porque estoy a favor de event-driven architecture. Pero debe surgir de la situación en la que estoy escribiendo secuencial código, y necesito llamar a un método asincrónico en el medio, me gusto lo de apalancamiento corrutinas a mantenerlo de esa manera y evitar envolver todo en Observables.

    Editar: Ahora que estoy utilizando corrutinas es el momento para una actualización.

    RxKotlin es sólo azúcar sintáctico para uso RxJava en Kotlin, así que voy a hablar acerca de RxJava y no RxKotlin en el siguiente. Corrutinas son menor de la palanca y el concepto más general de RxJava, que servir a los demás casos de uso. Dicho esto, hay un caso de uso donde se podría comparar RxJava y corrutinas (channel), es que pasa en torno a los datos de forma asíncrona. Corrutinas tienen una clara ventaja sobre el RxJava aquí:

    Corrutinas son mejores para lidiar con los recursos

    • En RxJava puede asignar los cálculos para los programadores pero subscribeOn() y ObserveOn()son confusas. Cada corutina se da en un contexto de subproceso y volver a padres contexto. Para un canal, ambos lados (productor, consumidor) ejecutar en su propio contexto. Corrutinas son más intuitivas en el hilo o hilo de la piscina afectación.
    • Corrutinas darle más control sobre cuando aquellos cálculo ocurrir. Por ejemplo, puede pasar de mano (yield), priorizar (select), paralelo (varios producer/actor en channel) o el recurso de bloqueo (Mutex) para un determinado cálculo. No importa el servidor (donde RxJava llegó primero), pero sobre los recursos limitados de medio ambiente de este nivel de control puede ser requerido.
    • Debido a la naturaleza reactiva, la contrapresión no encaja bien en RxJava. En el otro extremo send() para canal es suspensivo de la función que suspender cuando la capacidad del canal es alcanzado. Es out-of-the-box de contrapresión dado por la naturaleza. Usted también podría offer() para el canal, en cuyo caso la llamada nunca suspender pero volver false en caso de que el canal está lleno, reproduciendo eficazmente onBackpressureDrop() de RxJava. O puede escribir su propio personalizado de la contrapresión de la lógica, que no será difícil con corrutinas, especialmente en comparación con hacer lo mismo con RxJava.

    Hay otro caso de uso, donde corrutinas brillar y este va a responder a su segunda pregunta «¿por Qué iba yo a querer usar Kotlin corrutinas?». Corrutinas son el reemplazo perfecto para los subprocesos en segundo plano o AsyncTask (Android). Es tan fácil como launch { someBlockingFunction() }. Por supuesto, usted puede lograr esto con RxJava también, el uso de Schedulers y Completable tal vez. No (o poco) utilizar el patrón Observer y los operadores que son la firma de RxJava, un indicio de que este trabajo está fuera del ámbito de RxJava. RxJava complejidad (un inútil impuestos aquí) va a hacer que tu código sea más detallado y menos limpia Corutina de la versión.

    La legibilidad de los asuntos. En este sentido, RxJava y corrutinas enfoque difieren mucho. Corrutinas son más simples que RxJava. Si no estás a gusto con map(), flatmap() y funcional reactivo de programación en general, corrutinas manipulaciones son más fáciles, involucrando conceptos básicos de instrucciones: for, if, try/catch … Pero personalmente creo corutina del código más difícil de entender para los no-trivial de tareas. Especialmente esto implica más de anidación y la sangría mientras que el operador de encadenamiento en RxJava mantener todo en línea. Funcional de estilo de programación de hacer el procesamiento de más explícito. En la parte superior de que RxJava puede resolver un complejo de transformaciones con un par de operadores estándar de los ricos (OK, demasiado rico) operador establecido. RxJava brillar cuando usted tiene flujos de datos complejos que requieren una gran cantidad de combinaciones y transformaciones.

    Espero que estas consideraciones le ayudará a elegir la herramienta adecuada dado a sus necesidades.

    • Así que en lugar de envolver todo en un Observable, va a envolver todo en un Futuro.
    • Afortunadamente, Kotlin corrutinas son muy a diferencia de C# y JS y no requieren de envolver el código en un Futuro. Que puede el uso de futuros con Kotlin corrutinas, pero idiomáticas el código que se basa en Kotlin corrutinas casi no utiliza futuros a todos.
    • Uno puede hacer el evento impulsado por la arquitectura a través de canales con bastante facilidad.
    • couroutines parece algo mal se está utilizando. fresco.
    • ¿crees que se puede usar tanto en algunas situaciones?
    • Personalmente me gustaría evitar la mezcla de Corrutinas y RxJava, de la coherencia y la complejidad de razones. Dependiendo de su caso de uso, usted puede considerar la posibilidad de Corrutinas con LiveData o el recién presentado de Flujo tipo: Romanos Elizarov: Frío fluye, bañera de canales

  2. 73

    Kotlin corrutinas son diferentes de Rx. Es difícil comparar manzanas con manzanas, porque Kotlin corrutinas son una fina característica del lenguaje (con sólo un par de conceptos básicos y algunas funciones básicas para manipular), mientras que los Rx es bastante pesado biblioteca con gran variedad de listos-para-usar los operadores. Ambos están diseñados para abordar un problema de programación asincrónica, sin embargo su enfoque de la solución es muy diferente:

    • Rx viene con un particular estilo funcional de programación que puede ser implementado en prácticamente cualquier lenguaje de programación, sin el apoyo de la lengua en sí misma. Funciona bien cuando el problema a la mano fácilmente se descompone en una secuencia de operadores estándar y no tan bien lo contrario.

    • Kotlin corrutinas proporcionar una característica del lenguaje que vamos a la biblioteca de escritores de la implementación de los distintos estilos de programación asincrónica, incluyendo, pero no limitado a, funcional reactivo estilo (Rx). Con Kotlin corrutinas también puede escribir el código asincrónico en estilo imperativo, en la promesa de futuros basados en el estilo, en actor de estilo, etc.

    Es más apropiado para comparar Rx con algunas librerías específicas que se realiza sobre la base de Kotlin corrutinas.

    Tomar kotlinx.co-rutinas de la biblioteca como un ejemplo. Esta biblioteca proporciona un conjunto de primitivas como async/await y canales que normalmente se incluyen en otros lenguajes de programación. También dispone de soporte para la luz-peso futuro-menos actores. Puede leer más en el Guía para kotlinx.corrutinas por ejemplo.

    De los canales previstos por kotlinx.coroutines se puede reemplazar o aumentar Rx en ciertos casos de uso. Hay un cuarto de Guía de reactivos arroyos con corrutinas que se profundiza en las similitudes y diferencias con Rx.

    • ¿Qué acerca del Error/Excepción de Manejo de la Gestión ? Es Rx mejor que Corrutinas ?
    • Si comparamos Rx para kotlinx.co-rutinas de la biblioteca, ambos proporcionan aproximadamente idénticos error/excepción de las capacidades de manejo, modulo diferencias de estilo. Puede instalar mundial de error/excepción de los manipuladores o controlar los errores localmente con diversas construcciones.
    • Yo diría que corrutinas definitivamente son más flexibles en el manejo de errores, ya que puede usar el buen viejo try-catch. Salir-de-la-caja de control del alcance que claramente, visualmente delimita lo que está protegiendo. Puede anidar estos bloques de código y hasta intrincados error de patrones de manejo que son todavía bastante fácil razonar acerca de. Sintácticamente, toda una biblioteca basada en funciones de orden superior se puede utilizar es el método de la cadena. Corrutinas tienen todo el lenguaje.
    • ¿Qué es un ejemplo de un problema/código que no «fácilmente se descomponen en una secuencia de operadores estándar»?
  3. 4

    La charla/doc vinculado no hablar de los canales. Los canales son lo que llenar la brecha entre el conocimiento actual de corrutinas y controlada por eventos de la programación.

    Con corrutinas y canales que usted puede hacer controlada por eventos de la programación, ya que probablemente se utiliza para hacer con rx, pero se puede hacer con sincrónica, en busca de código y sin tantos «personalizada» de los operadores.

    Si quieres entender mejor esto sugiero mirar fuera de kotlin, donde los conceptos son más maduro y refinado (no experimental). Mira core.async de Clojure, Rich Hickey, vídeos, posts y discusiones.

Dejar respuesta

Please enter your comment!
Please enter your name here