Obecnie mam wrażenie, że nadmiernie używam wielowątkowości.
Mam 3 rodzaje danych, A, B i C.
Każdy z nich A
można przekonwertować na wiele B
s, a każdy B
można przekonwertować na wiele C
s.
Interesuje mnie tylko leczenie C
s.
Mógłbym napisać to dość łatwo za pomocą kilku funkcji konwersji. Ale złapałem się jej wykonania z gwintem trzy kolejki ( queue_a
, queue_b
i queue_c
). Istnieją dwa wątki wykonujące różne konwersje i jeden pracownik:
ConverterA
czytaqueue_a
i pisze doqueue_b
ConverterB
czytaqueue_b
i pisze doqueue_c
Worker
obsługuje każdy element zqueue_c
Konwersje są dość przyziemne i nie wiem, czy ten model jest zbyt skomplikowany. Ale wydaje mi się to wyjątkowo solidne. Każdy „konwerter” może zacząć działać, nawet zanim dane dotrą do kolejek, aw dowolnym momencie w kodzie mogę po prostu „przesłać” nowe A
s lub B
s, co uruchomi potok konwersji, który z kolei wywoła zadanie przez pracownika wątek.
Nawet wynikowy kod wygląda na prostszy. Ale nadal nie jestem pewien, czy nadużywam wątków w celu uzyskania czegoś prostego.
źródło
Odpowiedzi:
Prawie zawsze łatwiej jest myśleć sekwencyjnie, a następnie zmodyfikować tę logikę, aby lepiej działała przy użyciu wątków. I, jak mówi wyrażenie: „Jeśli nie jest zepsute, nie naprawiaj go”. Większość programistów nie używa wątków tylko dlatego, że nie ma potrzeby ich używania.
Jeśli czujesz się bardziej komfortowo z ich użyciem, masz dla ciebie więcej mocy. Jednak wiedz, że jeśli wątki nie zapewniają zwiększenia prędkości poprzez wyeliminowanie wąskich gardeł, prawie na pewno spowalniają twój program.
Weź również pod uwagę, że systemy, które poświęcają procesowi tylko jeden procesor, będą symulować wiele wątków przez jeden wątek, aby zaoszczędzić zasoby (nie zdarza się to często w nowoczesnych komputerach, chociaż aplikacje na smartfony są nadal bardzo narażone na takie nadużycia). W takim przypadku, nawet jeśli eliminujesz wąskie gardła za pomocą wątków, będzie to faktycznie wolniejsze, niż jeśli w ogóle nie używałeś wątków.
Być może jest to najbardziej subtelny powód, aby zachować ostrożność podczas używania wątków, ale z pewnością nie jest to najmniej ważne, że wątki mają tendencję do robienia tego, czego się nie spodziewasz. Tak, jeśli podejmujesz środki ostrożności, powinieneś być w porządku. Tak, jeśli twoje wątki nie zapisują do zmiennych współdzielonych między wątkami, powinieneś być w porządku. To powiedziawszy, błędy związane z wątkami są bardzo trudne do znalezienia. Ponieważ uważam, że programista nigdy nie może całkowicie wyeliminować możliwości tworzenia błędów w kodzie, a zatem programista powinien podjąć działania w celu ochrony przed możliwymi błędami, zamiast skupiać się na ich całkowitym wyeliminowaniu, zdecydowanie powinieneś zastosować ten pomysł do znaleźć również błędy wątków. Innymi słowy, wiedz, że pomimo twoich najlepszych starań,
Więc czy powinieneś używać wątków? Cóż, zdrowa znajomość wątków z pewnością nie jest złą rzeczą, szczególnie jeśli staniesz się w tym dobry. Jednak ostatnio nastąpił ruch w kierunku języków jednowątkowych, takich jak node.js. Jedną z głównych zalet posiadania pojedynczego wątku jest to, że można go łatwo skalować i można dokonać pewnych optymalizacji, jeśli wiadomo, że instrukcje powinny być uruchamiane sekwencyjnie (nawet jeśli optymalizacje mogą oznaczać, że instrukcje, które można uruchomić równolegle, mogą działać asynchronicznie).
To powiedziawszy, mówię: rób to, co najbardziej dla ciebie wygodne. Z mojego doświadczenia wynika, że pisanie programu, który rozumiesz, ma wyższy priorytet niż przyspieszenie jego działania. Pamiętaj tylko, aby używać wątków, gdy uważasz, że pomaga to napisać program, a nie dlatego, że chcesz, aby działał szybciej, ponieważ nie powinieneś martwić się tak bardzo o wydajność, jak piszesz program (optymalizacja jest ważna, ale jest może również poczekać).
źródło