Comment savoir si j'utilise trop le multithread?

15

Je sens actuellement que je sur-utilise le multi-threading.

J'ai 3 types de données, A, B et C.

Chacun Apeut être converti en plusieurs Bs et chacun Bpeut être converti en plusieurs Cs.

Je veux seulement traiter l' Cart.

Je pourrais écrire cela assez facilement avec quelques fonctions de conversion. Mais je me suis surpris à l'implémenter avec des threads, trois files d'attente ( queue_a, queue_bet queue_c). Il existe deux threads effectuant les différentes conversions, et un travailleur:

  • ConverterAlit queue_aet écrit dansqueue_b
  • ConverterBlit queue_bet écrit dansqueue_c
  • Worker gère chaque élément de queue_c

Les conversions sont assez banales, et je ne sais pas si ce modèle est trop alambiqué. Mais cela me semble extrêmement robuste. Chaque "convertisseur" peut commencer à fonctionner avant même que les données soient arrivées dans les files d'attente, et à tout moment dans le code, je peux simplement "soumettre" de nouveaux As ou Bs et cela déclenchera le pipeline de conversion qui déclenchera à son tour un travail par le travailleur fil.

Même le code résultant semble plus simple. Mais je ne sais toujours pas si j'abuse des discussions pour quelque chose de simple.

exhuma
la source
5
Je pense que cette question doit être un peu raccourcie pour être plus précise. Le titre est également trompeur - il semble que vous soyez sur le point de vous lancer dans une diatribe (même si vous ne l'êtes pas). Vous devriez peut-être demander quelque chose de plus proche de "Comment puis-je savoir si j'utilise trop le multithreading?"
KChaloux
@KChaloux Je suis d'accord. Je l'ai édité et j'espère qu'il capture un peu mieux mes pensées.
exhuma
4
@exhuma Awesome. Votre -1 devient un +1
KChaloux
3
@KChaloux ... la différence qu'une visite aux toilettes peut faire pour votre réflexion ... :)
exhuma
Ce livre PDF en ligne, Mature Optimization Handbook (qui vient d'être publié il y a quelques jours) parle des effets systématiques dans lesquels l'impact d'un module sur les performances globales du système peut parfois dépasser la fraction du temps d'exécution du module.
rwong

Réponses:

16

Il est presque toujours plus simple de penser de manière séquentielle, puis de modifier ultérieurement cette logique pour mieux fonctionner à l'aide de threads. Et, comme le dit l'expression, "Si ce n'est pas cassé, ne le répare pas." La plupart des programmeurs n'utilisent pas de threads simplement parce qu'il n'est pas nécessaire de les utiliser.

Si vous vous sentez plus à l'aise de les utiliser, plus de puissance pour vous. Cependant, sachez que si les threads n'offrent pas une augmentation de vitesse en éliminant les goulots d'étranglement, ils ralentissent presque certainement votre programme.

Considérez également que les systèmes qui dédient un seul processeur à un processus simuleront plusieurs threads par un seul thread afin d'économiser des ressources (cela ne se produit pas souvent avec les ordinateurs modernes, bien que les applications de téléphones intelligents soient encore très soumises à cet abus). Dans ce cas, même si vous éliminez les goulots d'étranglement grâce à l'utilisation de threads, cela sera en fait plus lent que si vous ne l'utilisiez pas du tout.

Et, peut-être la raison la plus subtile de faire preuve de prudence pour utiliser des threads, mais certainement pas la moins importante, les threads ont tendance à faire ce que vous ne vous attendez pas. Oui, si vous prenez des précautions, ça devrait aller. Oui, si vos threads n'écrivent pas dans des variables partagées entre les threads, vous devriez être d'accord. Cela dit, les bogues liés aux threads sont très difficiles à trouver. Étant donné que je suis d'avis qu'un programmeur ne peut jamais éliminer complètement la possibilité de créer des bogues dans le code et donc un programmeur devrait prendre des mesures pour se protéger contre d'éventuels bogues plutôt que de se concentrer sur leur élimination complète, vous devriez certainement appliquer cette idée aux hard- pour trouver également des bogues de threads. En d'autres termes, sachez que malgré tous vos efforts,

Alors, devriez-vous quand même utiliser des threads? Eh bien, une bonne connaissance des threads n'est certainement pas une mauvaise chose, surtout si vous devenez bon dans ce domaine. Cependant, le mouvement récent s'est orienté vers des langages à un seul thread tels que node.js. L'un des principaux avantages d'avoir un seul thread est qu'il est facile à mettre à l'échelle et certaines optimisations peuvent être faites si vous savez que les instructions doivent être exécutées séquentiellement (même si les optimisations peuvent signifier que les instructions qui peuvent être exécutées en parallèle peuvent être exécuté de manière asynchrone).

Cela dit, je dis de faire ce qui vous convient le mieux. D'après mon expérience, l'écriture d'un programme que vous comprenez est plus prioritaire que son accélération. Assurez-vous simplement d'utiliser des threads lorsque vous pensez que cela vous aide à écrire le programme, et non pas parce que vous voulez qu'il fonctionne plus rapidement, car vous ne devriez pas vous soucier autant des performances que vous écrivez le programme (l'optimisation est importante, mais elle peut également attendre).

Neil
la source
Vous faites des remarques intéressantes. Dans mon cas, le pipeline de conversion ne concerne pas les performances. Il s'agit de simplicité / lisibilité du code. Le thread de travail est sur la performance. Chaque tâche finale s'exécute sur une machine distante et la soumission de plusieurs tâches accélère considérablement son exécution.
exhuma
2
@exhuma Outre l'exécution parallèle via plusieurs threads, vous pouvez également utiliser des techniques asynchrones telles que Futures / Promises, ou un style orienté rappel. Notez que vous pouvez modéliser des pipelines en chaînant des itérateurs / flux; il n'est pas nécessaire d'utiliser réellement des threads - sauf si vous souhaitez utiliser plusieurs processeurs (dans le code réseau, ce n'est presque jamais le cas)
amon
@exhuma Oui, les threads contribuent aux performances en général. Mon point était que si vous ne le faites pas parce que c'est trop lent, alors vous devriez le faire parce que cela vous aide à écrire votre programme. L'optimisation devrait toujours venir plus tard. Il se peut même que la suppression de threads de votre programme l'optimise (bien que ce ne soit pas le cas pour la plupart des programmeurs).
Neil
OT: J'adore ton avatar. Fais moi rire.
Marjan Venema
@exhuma, je suis d'accord avec cette réponse mais j'ajouterais que si vous allez utiliser des threads pour la simplicité du code, c'est bien, mais faites très attention à bien comprendre la sécurité des threads et les accrochages potentiels avec plusieurs threads. Ce qui pourrait ressembler à un simple morceau de code multithread pourrait facilement avoir des conditions de concurrence cachées qui pourraient conduire à un assortiment de bogues très difficiles à localiser.
Ben Lee