멀티 스레딩을 과도하게 사용하고 있는지 어떻게 알 수 있습니까?


15

현재 멀티 스레딩을 과도하게 사용하고있는 것 같습니다.

A, B 및 C의 세 가지 유형의 데이터가 있습니다.

각각은 A복수로 변환 할 수 B의 각각은 B복수로 변환 할 수 C의.

나는 Cs 치료에만 관심이 있습니다.

나는 이것을 몇 가지 변환 함수로 상당히 쉽게 작성할 수 있습니다. 그러나 스레드, 세 개의 대기열 ( queue_a, queue_bqueue_c)로 구현하는 것을 보았습니다 . 서로 다른 변환을 수행하는 두 개의 스레드와 한 명의 작업자가 있습니다.

  • ConverterA읽고 queue_a쓴다queue_b
  • ConverterB읽고 queue_b쓴다queue_c
  • Worker 각 요소를 처리 queue_c

변환은 상당히 평범하며이 모델이 너무 복잡한 지 모르겠습니다. 그러나 그것은 나에게 매우 강력 해 보입니다. 각 "컨버터"는 데이터가 대기열에 도착하기 전에도 작동을 시작할 수 있으며 코드에서 언제든지 새 As 또는 Bs를 "제출" 할 수 있으며 변환 파이프 라인을 트리거하여 작업자가 작업을 트리거합니다. 실.

결과 코드조차도 더 단순 해 보입니다. 그러나 여전히 간단한 것을 위해 스레드를 남용하는지 확실하지 않습니다.


5
나는이 질문을 쫓아 가기 위해 조금 단축해야한다고 생각합니다. 제목도 오해의 소지가 있습니다. "멀티 스레딩을 과도하게 사용하고 있는지 어떻게 알 수 있습니까?"
KChaloux

@KChaloux 동의합니다. 나는 그것을 편집했고, 그것이 내 생각을 조금 더 잘 포착하기를 바랍니다.
exhuma

4
@exhuma 굉장합니다. 당신의 -1은 +1이됩니다
KChaloux

3
@ KChaloux ... 화장실에 대한 방문이 당신의 사고 과정을 만들 수있는 차이 ... :)
exhuma

이 온라인 PDF 책인 Mature Optimization Handbook (방금 전 게시)은 모듈이 전체 시스템 성능에 미치는 영향이 때때로 모듈 실행 시간의 일부를 초과 할 수있는 체계적인 영향에 대해 설명합니다 .
rwong

답변:


16

순차적으로 생각한 다음 스레드를 사용하여 더 잘 작동하도록 나중에 해당 논리를 수정하는 것이 거의 항상 간단합니다. 그리고 표현이 "파손되지 않았다면 고치지 마십시오." 대부분의 프로그래머는 쓰레드를 사용할 필요가 없기 때문에 쓰레드를 사용하지 않습니다.

당신이 그들을 사용하는 것이 더 편안하다고 느끼면, 당신에게 더 많은 힘. 그러나 스레드가 병목 현상을 제거하여 속도 향상을 제공하지 않으면 거의 확실히 프로그램 속도가 느려집니다.

또한 프로세스에 하나의 CPU 만 사용하는 시스템은 리소스를 절약하기 위해 하나의 스레드로 여러 스레드를 시뮬레이션한다는 점을 고려하십시오 (스마트 폰 응용 프로그램은 여전히 ​​이러한 악용의 대상이 되기는하지만 최신 컴퓨터에서는 자주 발생하지 않음). 이 경우 스레드를 사용하여 병목 현상을 제거하더라도 스레드를 전혀 사용하지 않는 것보다 실제로 속도느려집니다 .

그리고 아마도 스레드를 사용하기 위해주의를 기울여야하는 가장 미묘한 이유이지만, 가장 중요하지 않은 스레드는 예상치 못한 일을하는 경향이 있습니다. 예, 예방 조치를 취하고 있다면 괜찮을 것입니다. 예, 스레드가 스레드간에 공유되는 변수에 쓰지 않으면 괜찮을 것입니다. 즉, 스레드 관련 버그는 찾기가 매우 어렵습니다. 프로그래머가 코드에서 버그를 생성 할 가능성을 완전히 제거 할 수는 없기 때문에 프로그래머는 버그를 완전히 제거하는 데 초점을 맞추기보다는 가능한 버그로부터 보호하기위한 조치를 취해야합니다. 스레드 버그도 찾을 수 있습니다. 다시 말해, 최선의 노력에도 불구하고

어쨌든 스레드를 사용해야합니까? 글쎄, 실에 대한 건강한 지식은 확실히 나쁜 것이 아닙니다. 특히 당신이 그것에 능숙하다면. 그러나 최근에 node.js와 같은 단일 스레드 언어로 이동했습니다. 단일 스레드를 사용하는 주된 장점 중 하나는 확장이 쉽고 명령이 순차적으로 실행될 것으로 예상되는 경우 (최적화가 병렬로 실행될 수있는 명령이 비동기식으로 실행).

즉, 나는 당신에게 가장 편안한 것을하십시오. 내 경험상, 이해하는 프로그램을 작성하는 것이 더 빨리 작동하는 것보다 우선 순위가 높습니다. 그냥 당신이 당신이 프로그램을 작성, 당신은 당신이 성능에 대해 너무 많이 걱정해서는 안 이후로는 빠르게 작업하고 싶지 때문에 도움이 생각할 때 사용 스레드에 반드시 당신이 쓰는대로 프로그램 (최적화가 중요하지만, 기다릴 수도 있습니다).


당신은 흥미로운 포인트를 만들고 있습니다. 필자의 경우 변환 파이프 라인은 성능에 관한 것이 아닙니다. 코드 단순성 / 가독성에 관한 것입니다. 작업자 스레드 성능 관한 것입니다. 각 최종 작업은 원격 시스템에서 실행되며 여러 작업을 제출하면 훨씬 빠르게 실행됩니다.
exhuma

2
@exhuma 여러 스레드를 통한 병렬 실행 외에도 Futures / Promises와 같은 비동기 기술이나 콜백 지향 스타일을 사용할 수도 있습니다. 반복자 / 스트림을 연결하여 파이프 라인을 모델링 할 수 있습니다. 다중 CPU를 사용하려는 경우를 제외하고 실제로 스레드를 사용할 필요가 없습니다 (네트워킹 코드에서는 거의 그렇지 않습니다)
amon

@exhuma 예, 스레드는 일반적으로 성능을 향상시킵니다. 내 요점은 너무 느려서하지 않으면 프로그램 작성에 도움이되므로 그렇게해야한다는 것입니다. 최적화는 항상 나중에 이루어져야합니다. 프로그램에서 스레드를 제거하면 최적화하는 것일 수도 있습니다 (대부분의 프로그래머에게는 해당되지 않음).
Neil

OT : 나는 당신의 아바타를 좋아합니다. 나를 웃게한다.
Marjan Venema

@ exhuma, 나는이 답변에 동의하지만 코드 단순화를 위해 스레드를 사용하려는 경우 괜찮지 만 여러 스레드로 스레드 안전성과 잠재적 문제를 이해하는 데 매우주의해야한다고 덧붙입니다. 단순한 멀티 스레드 코드 조각처럼 보일 수있는 경쟁 조건을 쉽게 숨겨서 추적하기 어려운 매우 다양한 버그로 이어질 수 있습니다.
Ben Lee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.