>

다음 코드를 고려하십시오 :

var options = new ParallelOptions();
var urls = GetListOfUrls();
Parallel.ForEach(urls, options, url => {
    try {
        using (HttpClient client = new HttpClient()) {
            client.Timeout = TimeSpan.FromMinutes(30);
            Task task = client.GetAsync(url);
            task.Wait();
        }
    } catch (Exception exception) {
        Console.WriteLine(exception.Message);
    }
});

8 개의 코어가있는 VM에서 ~ 670 개의 스레드를 회전시킵니다. 이것이 정상입니까? TPL의 경험 법칙은 코어 당 25 스레드이며 200 스레드 범위에 넣을 것이라고 생각했습니다.

P.S. 아래 코드에서 GetListOfUrls()  백만개의 URL을 반환합니다.


  • 답변 # 1

    코드 예제는 비동기를 염두에두고 작성되지 않았습니다. 당신은 Parallel.ForEach 필요가 없습니다 조금도. 와이즈 비즈  이미 비동기 상태이므로CPU 바운드 작업으로 래핑 할 지점이 없습니다.

    HttpClient.GetAsync
    
    

    와이즈 비즈  보다 효율적인 루핑 및 private readonly _httpClient = new HttpClient(); var tasks = new List<Task>(); foreach(var url in urls) { var task = DoWork(url); tasks.Add(task); } await Task.WhenAll(tasks); foreach(var task in tasks) { if (task.Exception != null) Console.WriteLine(task.Exception.Message); } public async Task DoWork(string url) { var json = await _httpClient.GetAsync(url); // do something with json } 버전입니다.  실제로 Cpu Bound 작업 (Task.Run Etiquette 및 적절한 사용법)에만 사용해야합니다. URL 호출은 CPU 바운드 작업이 아니라 I/O 작업 (또는 기술적으로 IO Completion Port 작업이라고 함)입니다.

    HTTPCLIENT를 잘못 사용했으며 소프트웨어를 대상으로하고 있습니다

    와이즈 비즈

    반 패턴처럼 보이지만 실제로 제공된 솔루션은 반 패턴이기 때문입니다. 와이즈 비즈  외부 리소스를 사용하여 작업을 수행하므로폐기해야합니다( Parallel.ForEach() 를 구현 함) ) 그러나 동시에 싱글 톤으로 사용해야합니다. 클래스에서 정적 속성/필드로 사용되는 싱글 톤을 처분 할 수있는 확실한 방법이 없기 때문에 문제가됩니다. 그러나 mirosoft가 작성 했으므로 문서에 달리 명시되어있는 경우 생성 한 객체를항상처리해야한다는 것에 대해 걱정할 필요가 없습니다.

    와이즈 비즈

    비동기/대기

    와이즈 비즈

    따라서 병렬 작업의 수를 제한해야합니다.

    Task.Run()
    
    

  • 답변 # 2

    HttpClient 메소드가 비동기이기 때문에 병렬은 여기서 과도합니다. 대신 비동기식으로 호출하는 것이 좋습니다. 그렇지 않으면 대기하는 것 외에는 아무것도하지 않는 많은 스레드가 생성됩니다.

    또한

    Thanks for the HttpClient link. Wow. The fix seems like such an anti-pattern.

    의 단일 인스턴스를 사용하십시오. . 이는 캐시 적중을 증가시키고 HttpClient가 프록시 또는 DNS 정보에 액세스하기 위해 스레드를 스핀 업할 필요성을 줄입니다.

    HttpClient
    
    
    IDisposable

  • 이전 java - SMACK OMEMO를 사용하여 그룹 채팅 또는 MUC에 지문을 생성하는 방법은 무엇입니까?
  • 다음 gremlin - amazon neptune - 노드 속성