Momentan habe ich das Gefühl, dass ich Multithreading überbeanspruche.
Ich habe 3 Arten von Daten, A, B und C.
Jedes A
kann in mehrere B
s konvertiert werden und jedes B
kann in mehrere C
s konvertiert werden .
Ich interessiere mich nur für die Behandlung von C
s.
Ich könnte dies ziemlich leicht mit ein paar Konvertierungsfunktionen schreiben. Aber ich ertappte mich mit Themen der Umsetzung drei Warteschlangen ( queue_a
, queue_b
und queue_c
). Es gibt zwei Threads, die die verschiedenen Konvertierungen durchführen, und einen Worker:
ConverterA
liest ausqueue_a
und schreibt anqueue_b
ConverterB
liest ausqueue_b
und schreibt anqueue_c
Worker
behandelt jedes Element vonqueue_c
Die Konvertierungen sind ziemlich banal, und ich weiß nicht, ob dieses Modell zu verworren ist. Aber es scheint mir extrem robust zu sein. Jeder "Konverter" kann mit der Arbeit beginnen, noch bevor Daten in den Warteschlangen eingegangen sind, und zu jeder Zeit im Code kann ich einfach neue A
s oder B
s "einreichen" und es wird die Konvertierungs-Pipeline ausgelöst, die wiederum einen Job durch den Arbeiter auslöst Faden.
Sogar der resultierende Code sieht einfacher aus. Ich bin mir aber immer noch nicht sicher, ob ich Threads für etwas Einfaches missbrauche.
quelle
Antworten:
Es ist fast immer einfacher, nacheinander zu denken und diese Logik später zu ändern, um die Verwendung von Threads zu verbessern. Und, wie der Ausdruck sagt: "Wenn es nicht kaputt ist, repariere es nicht." Die meisten Programmierer verwenden keine Threads, nur weil sie nicht benötigt werden.
Wenn Sie sich mit ihnen wohler fühlen, haben Sie mehr Kraft. Beachten Sie jedoch, dass Threads Ihr Programm mit ziemlicher Sicherheit verlangsamen, wenn sie keinen Geschwindigkeitsschub durch Beseitigung von Engpässen bieten.
Bedenken Sie auch, dass Systeme, die nur eine CPU für einen Prozess verwenden, mehrere Threads durch einen einzigen Thread simulieren, um Ressourcen zu sparen (dies ist bei modernen Computern nicht häufig der Fall, obwohl Smartphone-Anwendungen immer noch stark von diesem Missbrauch betroffen sind). In diesem Fall ist es sogar langsamer , wenn Sie Engpässe durch die Verwendung von Threads beseitigen, als wenn Sie überhaupt keine Threads verwendet haben.
Und, vielleicht der subtilste Grund, vorsichtig mit Threads umzugehen, aber sicherlich nicht der unwichtigste, Threads neigen dazu, das zu tun, was Sie nicht erwarten. Ja, wenn Sie Vorsichtsmaßnahmen treffen, sollten Sie in Ordnung sein. Ja, wenn Ihre Threads nicht in Variablen schreiben, die von Threads gemeinsam genutzt werden, sollten Sie in Ordnung sein. Allerdings sind Thread-bezogene Bugs sehr schwer zu finden. Da ich der Meinung bin, dass ein Programmierer die Möglichkeit, Fehler im Code zu erstellen, niemals vollständig ausschließen kann und daher ein Programmierer Maßnahmen zum Schutz vor möglichen Fehlern ergreifen sollte, anstatt sich darauf zu konzentrieren, diese Fehler vollständig zu beseitigen, sollten Sie diese Idee auf jeden Fall auf Hard- um auch Thread-Bugs zu finden. Mit anderen Worten, wissen Sie, dass trotz Ihrer allerbesten Bemühungen,
Solltest du trotzdem Threads verwenden? Nun, ein gesundes Wissen über Threads ist sicherlich keine schlechte Sache, besonders wenn Sie gut darin werden. Die Bewegung in letzter Zeit war jedoch in Richtung Singlethread-Sprachen wie node.js. Einer der Hauptvorteile eines einzelnen Threads besteht darin, dass er einfach zu skalieren ist und bestimmte Optimierungen vorgenommen werden können, wenn Sie wissen, dass die Anweisungen sequentiell ausgeführt werden sollen (auch wenn Optimierungen bedeuten können, dass Anweisungen parallel ausgeführt werden können asynchron ausgeführt werden).
Das heißt, ich sage tun, was für Sie am bequemsten ist. Nach meiner Erfahrung hat das Schreiben eines Programms, das Sie verstehen, eine höhere Priorität, als es schneller arbeiten zu lassen. Verwenden Sie Threads nur, wenn Sie der Meinung sind, dass sie Ihnen beim Schreiben des Programms helfen, und nicht, weil Sie möchten, dass es schneller funktioniert, da Sie sich nicht so sehr um die Leistung sorgen sollten, wie Sie das Programm schreiben (Optimierung ist wichtig, aber es ist wichtig) kann auch warten).
quelle