Jak mogę sprawdzić, czy nadużywam wielowątkowości?

15

Obecnie mam wrażenie, że nadmiernie używam wielowątkowości.

Mam 3 rodzaje danych, A, B i C.

Każdy z nich Amożna przekonwertować na wiele Bs, a każdy Bmożna przekonwertować na wiele Cs.

Interesuje mnie tylko leczenie Cs.

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_bi queue_c). Istnieją dwa wątki wykonujące różne konwersje i jeden pracownik:

  • ConverterAczyta queue_ai pisze doqueue_b
  • ConverterBczyta queue_bi pisze doqueue_c
  • Worker obsługuje każdy element z queue_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 As lub Bs, 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.

ekshuma
źródło
5
Myślę, że to pytanie należy nieco skrócić, aby przejść do ścigania. Tytuł jest również mylący - brzmi, jakbyś miał zamiar rozpocząć rant (nawet jeśli tak nie jest). Może powinieneś zapytać o coś bliższego „Jak mogę stwierdzić, czy nadużywam wielowątkowości?”
KChaloux,
@KChaloux Zgadzam się. Zredagowałem to i mam nadzieję, że lepiej uchwyci moje myśli.
ekshuma
4
@exhuma Awesome. Twoje -1 staje się +1
KChaloux
3
@KChaloux ... różnica w wizycie w toalecie może mieć
wpływ na
Ta internetowa książka w formacie PDF, Podręcznik optymalizacji dla dorosłych (opublikowany kilka dni temu) mówi o efektach systematycznych, w których wpływ modułu na ogólną wydajność systemu może czasem przekraczać ułamek czasu jego wykonywania.
rwong

Odpowiedzi:

17

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ć).

Neil
źródło
Robisz ciekawe punkty. W moim przypadku potok konwersji nie dotyczy wydajności. Chodzi o prostotę / czytelność kodu. Nić pracownik jest o wydajności. Każde ostatnie zadanie działa na zdalnym komputerze, a przesłanie wielu zadań znacznie przyspiesza.
ekshuma
2
@exhuma Oprócz równoległego wykonywania za pomocą wielu wątków, można również zastosować techniki asynchroniczne, takie jak Futures / Promises, lub styl zorientowany na wywołanie zwrotne. Zauważ, że możesz modelować rurociągi, łącząc łańcuchy iteratorów / strumieni; nie ma potrzeby używania wątków - z wyjątkiem sytuacji, gdy chcesz korzystać z wielu procesorów (w kodzie sieciowym prawie nigdy tak nie jest)
am
@exhuma Tak, wątki ogólnie pomagają w wydajności. Chodzi mi o to, że jeśli nie robisz tego, ponieważ jest on zbyt wolny, powinieneś to zrobić, ponieważ pomaga to napisać program. Optymalizacja powinna zawsze nastąpić później. Może nawet być tak, że usuwanie wątków z twojego programu go optymalizuje (chociaż nie jest tak w przypadku większości programistów).
Neil,
OT: Kocham twój awatar. Sprawia że się uśmiecham.
Marjan Venema,
@exhuma, zgadzam się z tą odpowiedzią, ale dodam do niej, że jeśli zamierzasz używać wątków dla uproszczenia kodu, to dobrze, ale bądź bardzo ostrożny, aby zrozumieć bezpieczeństwo wątków i potencjalne problemy z wieloma wątkami. To, co może wydawać się prostym kawałkiem wielowątkowego kodu, może z łatwością mieć ukryte warunki rasowe, które mogą prowadzić do asortymentu bardzo trudnych do wyśledzenia błędów.
Ben Lee,