¿Cómo puedo saber si estoy abusando de los subprocesos múltiples?

15

Actualmente siento que estoy sobreutilizando los subprocesos múltiples.

Tengo 3 tipos de datos, A, B y C.

Cada A se puede convertir a múltiples B s y cada B se puede convertir a múltiples C s.

Sólo me interesa tratar C s.

Podría escribir esto con bastante facilidad con un par de funciones de conversión. Pero me sorprendí implementándolo con hilos, tres colas ( queue_a , queue_b y queue_c ). Hay dos hilos que hacen las diferentes conversiones, y un trabajador:

  • ConverterA lee desde queue_a y escribe en queue_b
  • ConverterB lee desde queue_b y escribe en queue_c
  • Worker maneja cada elemento desde queue_c

Las conversiones son bastante mundanas, y no sé si este modelo es demasiado complicado. Pero me parece extremadamente robusto. Cada "convertidor" puede comenzar a funcionar incluso antes de que lleguen los datos a las colas, y en cualquier momento en el código puedo simplemente "enviar" nuevo A s o B s y activará el proceso de conversión que a su vez desencadenar un trabajo por el hilo de trabajo.

Incluso el código resultante parece más simple. Pero todavía no estoy seguro de si estoy abusando de los hilos por algo simple.

    
pregunta exhuma 06.11.2013 - 14:25

1 respuesta

16

Casi siempre es más simple pensar de forma secuencial, y luego modificar esa lógica para que funcione mejor utilizando subprocesos. Y, como dice la expresión, "Si no está roto, no lo arregles". La mayoría de los programadores no usan hilos simplemente porque no hay necesidad de usarlos.

Si te sientes más cómodo usándolos, más poder para ti. Sin embargo, sepa que si los subprocesos no ofrecen un aumento de velocidad al eliminar los cuellos de botella, es casi seguro que su programa se está ralentizando.

También considere que los sistemas que dedican solo una CPU a un proceso simularán varios subprocesos en un solo subproceso para ahorrar recursos (esto no ocurre a menudo con las computadoras modernas, aunque las aplicaciones de teléfonos inteligentes todavía están muy sujetas a este abuso) ). En este caso, incluso si está eliminando cuellos de botella mediante el uso de subprocesos, en realidad será más lento que si no usara subprocesos en absoluto.

Y, quizás la razón más sutil para tener cuidado al usar hilos, pero ciertamente no es lo menos importante, los hilos tienen una tendencia a hacer lo que no esperas. Sí, si estás tomando precauciones, deberías estar bien. Sí, si sus subprocesos no escriben en variables compartidas entre subprocesos, debería estar bien. Dicho esto, los errores relacionados con los hilos son muy difíciles de encontrar. Como tengo la idea de que un programador nunca puede eliminar completamente la posibilidad de crear errores en el código y, por lo tanto, un programador debería tomar medidas para protegerse contra posibles errores en lugar de centrarse en eliminarlos por completo, definitivamente debería aplicar esta idea a para encontrar errores en el hilo también. En otras palabras, sepa que, a pesar de sus mejores esfuerzos, el uso de subprocesos en el código creará algunos errores muy serios, tarde o temprano, que de otro modo no tendría sin usar los subprocesos.

¿Entonces deberías usar hilos de todos modos? Bueno, un conocimiento saludable de los hilos no es algo malo, especialmente si te vuelves bueno en eso. Sin embargo, el movimiento de los últimos tiempos ha sido hacia lenguajes de un solo hilo como node.js. Una de las principales ventajas de tener un solo hilo es que es fácil de escalar y se pueden hacer ciertas optimizaciones si sabe que se espera que las instrucciones se ejecuten de manera secuencial (incluso si las optimizaciones pueden significar que las instrucciones que se pueden ejecutar en paralelo pueden ejecutarse de forma asíncrona).

Dicho esto, digo que hagas lo que sea más cómodo para ti. En mi experiencia, escribir un programa que entiendes tiene mayor prioridad que hacerlo funcionar más rápido. Solo asegúrate de usar hilos cuando creas que te ayuda a escribir el programa, y no porque quieras que funcione más rápido, ya que no debes preocuparte tanto por el rendimiento como estás escribiendo el programa (La optimización es importante, pero también puede esperar).

    
respondido por el Neil 06.11.2013 - 15:33

Lea otras preguntas en las etiquetas