¿Cómo puedo saber si estoy usando en exceso los subprocesos múltiples?

15

Actualmente siento que estoy usando en exceso los subprocesos múltiples.

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

Cada uno Ase puede convertir a múltiples Bsy cada uno Bse puede convertir a múltiples Cs.

Solo estoy interesado en tratar el Cs.

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

  • ConverterAlee queue_ay escribe enqueue_b
  • ConverterBlee queue_by escribe enqueue_c
  • Worker maneja cada elemento de 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 los datos lleguen a las colas, y en cualquier momento en el código puedo simplemente "enviar" nuevos Amensajes de correo Belectrónico y activará la canalización de conversión que a su vez activará un trabajo por parte del trabajador hilo.

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

exhuma
fuente
55
Creo que esta pregunta debe acortarse un poco para poder perseguirla. El título también es engañoso: parece que estás a punto de lanzar una protesta (aunque no lo estés). Tal vez debería preguntar algo más cercano a "¿Cómo puedo saber si estoy usando en exceso el subprocesamiento múltiple?"
KChaloux
@KChaloux Estoy de acuerdo. Lo he editado y espero que capture mis pensamientos un poco mejor.
exhuma el
44
@exhuma Impresionante. Tu -1 se convierte en +1
KChaloux
3
@KChaloux ... la diferencia que una visita al baño puede hacer en su proceso de pensamiento ... :)
exhuma el
Este libro PDF en línea, el Manual de Optimización Madura (publicado hace unos días) habla sobre los efectos sistemáticos en los que el impacto de un módulo en el rendimiento general del sistema a veces puede exceder la fracción del tiempo de ejecución del módulo.
rwong

Respuestas:

16

Casi siempre es más simple pensar de forma secuencial, y luego modificar esa lógica para que funcione mejor usando hilos. 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 hilos no ofrecen un aumento de velocidad al eliminar los cuellos de botella, es muy probable que estén ralentizando su programa.

También considere que los sistemas que dedican solo una CPU a un proceso simularán múltiples hilos por un solo hilo para ahorrar recursos (esto no sucede 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 elimina los cuellos de botella mediante el uso de hilos, en realidad será más lento que si no usara hilos.

Y, quizás la razón más sutil para tener precaución al usar hilos, pero ciertamente no es el menos importante, los hilos tienden a hacer lo que no esperas. Sí, si está tomando precauciones, debería estar bien. Sí, si sus hilos no escriben en variables compartidas entre hilos, debería estar bien. Dicho esto, los errores relacionados con hilos son muy difíciles de encontrar. Como soy de la idea de que un programador no puede eliminar por completo la posibilidad de crear errores en el código y, por lo tanto, un programador debe tomar medidas para protegerse contra posibles errores en lugar de centrarse en eliminarlos por completo, definitivamente debe aplicar esta idea a para encontrar errores de hilo también. En otras palabras, sepa que a pesar de sus mejores esfuerzos,

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

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 deberías preocuparte tanto por el rendimiento como cuando escribes el programa (la optimización es importante, pero También puede esperar).

Neil
fuente
Estás haciendo puntos interesantes. En mi caso, la canalización de conversión no se trata de rendimiento. Se trata de la simplicidad / legibilidad del código. El hilo de trabajo es sobre el rendimiento. Cada tarea final se ejecuta en una máquina remota, y el envío de múltiples trabajos hace que se ejecute significativamente más rápido.
exhuma el
2
@exhuma Además de la ejecución paralela a través de múltiples subprocesos, también puede usar técnicas asíncronas como Futures / Promises, o un estilo orientado a la devolución de llamadas. Tenga en cuenta que puede modelar tuberías encadenando iteradores / secuencias; no hay necesidad de usar hilos, excepto si desea utilizar múltiples CPU (en el código de red, este casi nunca es el caso)
amon
@exhuma Sí, los hilos ayudan con el rendimiento en general. Mi punto era que si no lo estás haciendo porque es demasiado lento, entonces debes hacerlo porque te ayuda a escribir tu programa. La optimización siempre debe venir más tarde. Incluso puede ser que eliminar hilos de su programa lo esté optimizando (aunque ese no es el caso para la mayoría de los programadores).
Neil
OT: Me encanta tu avatar. Me hace sonreír.
Marjan Venema el
@exhuma, estoy de acuerdo con esta respuesta, pero agregaría que si va a usar hilos para simplificar el código, está bien, pero tenga mucho cuidado de comprender la seguridad de los hilos y las posibles trampas con múltiples hilos. Lo que podría parecer una simple pieza de código multiproceso fácilmente podría tener condiciones de carrera ocultas que podrían conducir a una variedad de errores muy difíciles de rastrear.
Ben Lee