¿Cuáles son los beneficios de estilo sin bloqueo?

Vadim Parafenyuk:

Estoy tratando de comprender los principios básicos de la programación no bloqueante (y frameworks como reactor de proyecto). La idea principal es tener "grupo de subprocesos" con determinado número de hilos (ejecutores) y las tareas que se ejecutan allí. No debemos tener ningún hilos bloqueados. En "código de usuario" que acabamos de ejecutar algo de ejecutar y de devolución de llamada licencia (qué hacer con el resultado). Fuera "usuario" hilo no está bloqueado, a la derecha. Pero lo que si mi tarea depende de alguna consulta JDBC. Mi tarea solicitará esta consulta y luego será bloqueado esperando el resultado, ¿verdad? Por lo tanto, este hilo está bloqueado.

Pero evitamos la creación de hilo (que es caro). Es la principal ventaja de este estilo?

Si mi grupo de subprocesos consta de 2 ejecutores y ambos están bloqueados a la espera de algo, no se ejecutarán otras tareas, ¿verdad? ¿Cómo evitarlo? Crear más de 2 hilos?

Jesper:

Los hilos son relativamente costosos recursos del sistema. Por ejemplo, cada hilo necesita memoria para la pila de llamadas. ¿Cuánto se trata depende del sistema operativo, pero por lo general es algo así como 1 o 2 MB. Esto significa que no es una buena idea para empezar a miles de hilos - que le pierda 1 ó 2 GB de memoria sólo en las pilas de llamadas de 1000 hilos.

Por lo tanto, para hacer las cosas de manera más eficiente que desea limitar el número de hilos, por ejemplo utilizando un grupo de subprocesos para manejar el trabajo. El grupo de subprocesos hace que sea posible administrar el número de hilos que se están utilizando.

Sin embargo, imaginar que tendría un grupo de subprocesos con 10 hilos, y luego 10 solicitudes entrar. Cada uno de los hilos se reservará para manejar una petición. Mientras están ocupados, no se puede manejar la petición # 11, porque no hay ningún hilo suelto. Cuando está utilizando bloqueo de E / S, entonces, a pesar de todos sus 10 hilos no están haciendo nada (en espera de E / S al completo), solicitud # 11 no se puede manejar ...

Cuando se utiliza el no bloqueo de E / S, nunca necesitará hilos que esperar para E / S - así que cuando el manejo de peticiones # 3 está suspendida debido a que necesita el resultado de una operación de E / S, el hilo que estaba manejando de forma temporal puede cambiar a la manipulación de otras solicitudes.

Por lo tanto, la no-bloqueo de E / S, que nunca han subprocesos en espera y está utilizando los recursos del sistema de manera más eficiente.

Esto sólo funcionará si está utilizando no bloqueo de E / S de la parte delantera a la parte posterior de su sistema. Si en el back-end que está utilizando JDBC, que es una API de bloqueo, entonces usted pierde todo el beneficio de no bloqueo de E / S.

Por lo tanto, si usted tiene una base de datos en el back-end, esto funciona mejor si usted tiene una base de datos que soporta sin bloqueo de E / S. Algunas bases de datos NoSQL como MongoDB apoyan esto, y para algunas bases de datos relacionales que hay controladores especiales / API disponibles que soporten este. Usted no va a utilizar JDBC en ese caso, ya que es una API JDBC inherentemente bloqueo.

Oracle está trabajando en una nueva API de bases de datos relacionales tentativamente llamado ADBA que permitirán que hagas no bloqueo / asíncrono de E / S con bases de datos relacionales, pero aún no está listo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=221875&siteId=1
Recomendado
Clasificación