C# Async Await, 결국: 스레드 풀
저를 믿으세요. 저는 이것을 함께 가져오고 결국 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 루프 사이의 벤치마크 결과를 비교합니다. 스레드 시작이 비용이 많이 드는 작업이 될 수 있음을 알 수 있기를 바랍니다.
결론적으로 스레드 풀은 비동기 실행의 이점과 리소스 비용의 균형을 맞추는 방식으로 스레드 생성, 실행 및 소멸을 관리합니다.
Reference
이 문제에 관하여(C# Async Await, 결국: 스레드 풀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/ai101gh/c-async-await-eventually-thread-pools-jng
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[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>();
}
}
}
Reference
이 문제에 관하여(C# Async Await, 결국: 스레드 풀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ai101gh/c-async-await-eventually-thread-pools-jng텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)