java parallel-processing rx-java java-stream

RxJava vs Java 8 Parallelism Stream



parallel-processing rx-java (3)

La corriente se basa en la extracción. Personalmente siento que es la respuesta de Oracle a C # IEnumerable <>, LINQ y sus métodos de extensión relacionados.

RxJava está basado en push, por lo que no estoy seguro de si se trata de las extensiones reactivas de .NET que se lanzan primero o si el proyecto Rx se pone en marcha primero.

Conceptualmente son totalmente diferentes y sus aplicaciones también son diferentes.

Si está implementando un programa de búsqueda de texto en un archivo de texto que es tan grande que no puede cargar todo y quepa en la memoria, probablemente querrá usar Stream, ya que puede determinar fácilmente si tiene las siguientes líneas disponibles al realizar un seguimiento de su iterador, y escanear línea por línea.

Otra aplicación de Stream sería cálculos paralelos en una recopilación de datos. Hoy en día, todas las máquinas tienen múltiples núcleos, pero no sabrá con facilidad exactamente cuántos núcleos está disponible la máquina de su cliente. Sería difícil pre-configurar el número de hilos para operar. Así que usamos flujo paralelo y dejamos que la JVM determine eso para nosotros (se supone que es más óptimo).

Por otro lado, si está implementando un programa que toma una cadena de entrada de usuario y busca videos disponibles en la web, usaría RX ya que ni siquiera sabrá cuándo el programa comenzará a obtener resultados (o recibirá un error). del tiempo de espera de la red). Para que su programa sea receptivo, debe permitir que el programa se "suscriba" para recibir actualizaciones de red y señales completas.

Otra aplicación común de Rx es en la GUI para "detectar la entrada finalizada por el usuario" sin requerir que el usuario haga clic en un botón para confirmar. Por ejemplo, desea tener un campo de texto cuando el usuario deja de escribir, comienza a buscar sin esperar un clic en el botón "Buscar". En este caso, utiliza Rx para crear un observable en "KeyEvent" y "throttle" (por ejemplo, a 500 ms), de modo que cada vez que deja de escribir 500 ms, recibe un onNext () para "comenzar a buscar".

¿Cuáles son todas las similitudes y diferencias entre ellos? Parece que Java Parallel Stream tiene algunos de los elementos disponibles en RXJava, ¿no es así?


Rx es una API para crear y procesar secuencias observables . La API de Streams es para procesar secuencias iterables . Las secuencias de Rx están basadas en empuje ; se le notifica cuando un elemento está disponible. Un Stream está basado en el pull ; "Pide" artículos para procesar. Pueden parecer similares porque ambos admiten operadores / transformaciones similares, pero los mecanismos son esencialmente opuestos entre sí.


También hay una diferencia en el enhebrado.

Stream # parallel divide la secuencia en partes, y cada parte se procesa en el hilo separado.

Observable # subscribeOn y Observable # observeOn son ambos ejecución ''mover'' a otro hilo, pero no dividen la secuencia.

En otras palabras, para cualquier etapa de procesamiento particular:

  • Stream paralelo puede procesar diferentes elementos en diferentes hilos
  • Observable utilizará un hilo para el escenario.

P.ej. Tenemos Observable / Stream de muchos elementos y dos etapas de procesamiento:

Observable.create(...) .observeOn(Schedulers.io()) .map(x -> stage1(x)) .observeOn(Schedulers.io()) .map(y -> stage2(y)) .forEach(...); Stream.generate(...) .parallel() .map(x -> stage1(x)) .map(y -> stage2(y)) .forEach(...);

Observable no utilizará más de 2 subprocesos adicionales (uno por etapa), por lo que no se puede acceder a dos x''es o y''s mediante subprocesos diferentes. Stream, en el país, puede abarcar cada etapa a través de varios hilos.