C# Async Await, 결국: 스레드 풀

7326 단어 csharpasync
시리즈의 이전 게시물에서 비동기 프로그래밍이 무엇인지 다루고 스레드()를 소개했습니다. 이제 결국 동기화 컨텍스트(이제 겁먹지 마세요)가 무엇인지에 대한 설명을 듣게 되지만 이를 수행하려면 다른 질문에 답해야 합니다.

저를 믿으세요. 저는 이것을 함께 가져오고 결국 Async/Await에 도달할 것입니다. 바라건대 여러분은 후드 아래에서 무슨 일이 일어나고 있는지 더 잘 이해할 수 있는 위치에 있게 될 것입니다.



스레드 풀이란 무엇입니까?



간단히: 스레드 풀이란 무엇입니까?



스레드는 리소스를 많이 사용하는 크리터입니다. 그것들을 만드는 데 비교적 오랜 시간이 걸립니다. 이들의 풀을 생성함으로써 스레드 풀은 코드를 실행하는 데 사용할 준비가 된 스레드 세트를 갖게 됩니다.

스레드 풀 비유로 유머러스하게 ...



당신이 그것을 요청 그래서 여기 간다! 복사, 파일, 전화 응답 등 당신을 위해 일할 수 있는 비서 풀이 있다고 상상해 보십시오. 새 비서를 구하는 데는 광고, 인터뷰, 고용에 시간이 걸리므로 이미 준비가 된 비서가 있다고 결정합니다. 일이 들어오면 그 일을 할 비서를 배정하고 그 비서는 풀로 돌아와 다음 일을 기다립니다. (수영장은 수영장이나 당구대가 될 수 있지만 기본적으로 비서들이 새로운 일을 기다리며 시간을 보내는 곳입니다.) 이 비유에서는 비서 풀을 실행하고 있습니다. 비서를 스레드로 바꾸면 내가 어디로 가는지 알 수 있기를 바랍니다.

더 복잡함: 스레드 풀이 무엇입니까?



스레드는 리소스를 많이 사용하는 크리터입니다. 리소스 할당과 커널 공간과 런타임 간의 통신이 포함될 수 있기 때문에 시작하는 데 시간이 걸립니다. 참조용으로 다음 코드를 포함시켰지만 이 코드가 생성하는 막대 그래프에 집중하시기 바랍니다.

[RPlotExporter]
[SimpleJob(RunStrategy.ColdStart, RuntimeMoniker.Net50, baseline: true)]
public class ThreadPoolBaseliner
{
  private Thread[] simpleThreadPool; 

  [Params(1, 2, 4, 8, 16, 32, 64, 128)] public int N;

  [IterationSetup]
  public void Setup() => simpleThreadPool = new Thread[N];

  [Benchmark]
  public void ThreadCreation() => CreateThreads(N);

  [Benchmark]
  public void ForLoopAddition() => LoopAdditionFor(N);

  public void CreateThreads(int numberOfThreads)
  {
      for (int ii = 0; ii < numberOfThreads; ++ii)
      {
        simpleThreadPool[ii] = new Thread(() => 
          { Thread.Sleep(0); });
      }
  }

  public void LoopAdditionFor(int numberOfIterations)
  {
      int total = 0;
      for (int ii = 0; ii < numberOfIterations; ++ii) total += 42;
  }

  private class Program
  {
      public static void Main(string[] args)
      {
        var summary = BenchmarkRunner.Run<ThreadPoolBaseliner>();
      }
  }
}


나는 https://github.com/dotnet/BenchmarkDotNet을 사용하여 다음과 같은 막대 그래프를 생성했습니다...

시간은 마이크로초 단위로 표시되며 플롯은 반복 횟수가 1에서 시작하여 128이 될 때까지 두 배가 되는 스레드 생성과 간단한 for 루프 사이의 벤치마크 결과를 비교합니다. 스레드 시작이 비용이 많이 드는 작업이 될 수 있음을 알 수 있기를 바랍니다.

결론적으로 스레드 풀은 비동기 실행의 이점과 리소스 비용의 균형을 맞추는 방식으로 스레드 생성, 실행 및 소멸을 관리합니다.

좋은 웹페이지 즐겨찾기