이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 16497|회답: 5

[출처] .NET/C# HttpWebRequest 구멍을 이용한 다중 스레드 동시성

[링크 복사]
2021-12-20 15:21:04에 게시됨 | | | |
작업 스케줄링을 할 때, 스케줄링의 작업은 HTTP 요청을 시작하는 것을 시뮬레이션하는 것이고, 작업이 더 많아질수록 작업 스케줄링이 마치 가짜 죽음처럼 보인다는 것을 발견합니다.

일반 윈도우 시스템에서 요청된 최대 기본 연결 수는 2개이며, 서버 운영체제에서는 기본값이 10개입니다. 이 동시 연결 제한을 수정하지 않으면,그러면 클라이언트가 동시에 만들 수 있는 http 연결 수는 2개에서 10개뿐입니다

System.Net.ServicePointManager.DefaultConnectionLimit 이는 아래 그림과 같이 현재 기본 설정을 받을 수 있는 최대 연결 수입니다:



HttpClient에 기본 동시성 제한이 있나요?

.Net 4.0 이전에는 Http 작업은 HttpWebRequest에 의존했습니다. 기본적으로 같은 사이트에 대해 최대 2개의 동시성 제한을 매우 보수적으로 설정해 두어, 이로 인해 HttpWebRequests가 기본적으로 이상적인 속도를 얻지 못하는 경우가 많습니다(이 전략이 많은 개발자들을 답답하게 만드는 것 같습니다). 또한 App.config나 ServicePointManager.DefaultConnectionLimit의 값도 수정해야 합니다.

MS는 .Net 4.5에서 Http 작업을 처리하는 HttpClient 클래스를 도입했고, 저는 HttpClient와 HttpWebRequest가 같은 정책을 따른다고 생각했습니다. 오늘 멀티스레드 다운로드 프로그램을 작성할 때 10개의 동시 연결을 사용했는데, HttpClient에는 기본적으로 동시 연결 수 제한이 없다는 것을 알게 되었습니다.

처음에는 그렇다고 생각했어요. Net 4.5는 이 동시성 제한을 제거했는데(사실 지금은 아무도 이 표준을 따르지 않기 때문입니다), 관련 코드를 WebRequest로 다시 작성했더니 여전히 동시성 제한이 2였고 ServicePointManager.DefaultConnectionLimit의 값도 2였습니다. 즉, HttpClient는 HttpWebRequest 동시성 정책에 의해 제어되지 않으며, 시스템 수준의 동시성 제한도 없습니다.

또한 테스트 중에 HttpWebRequest가 모든 주소에 대해 최대 2개의 동시성을 기본값으로 설정하지 않는다는 것을 발견했습니다. 예를 들어로컬 HTTP 주소 연결(http://localhost/*)에는 동시성 제한이 없습니다.

C# 멀티스레드 환경이 HttpWebRequest 동시 연결 한계를 호출합니다

.net의 HttpWebRequest 또는 WebClient는 멀티스레딩의 경우 동시 연결 제한이 있으며, Windows XP와 Windows 7과 같은 데스크톱 운영체제에서는 기본적으로 2, 서버 운영체제에서는 기본적으로 10입니다. 이 동시 연결 제한을 변경하지 않으면, 클라이언트가 한 번에 할 수 있는 HTTP 연결 수는 2개나 10개뿐입니다. 브라우저나 스파이더와 같은 일부 애플리케이션에서는 2회 또는 10회 동시성 수가 너무 적어 애플리케이션 성능에 큰 영향을 미칩니다. 이 동시 연결 제한은 HTTP 1.0과 HTTP 1.1 표준이 최대 2개의 동시 연결을 명시하기 때문입니다. 하지만 주류 브라우저들은 더 이상 이 규칙을 따르지 않지만, .NET 프레임워크는 여전히 기본적으로 이 규칙을 따릅니다.

많은 글에서 HttpWebRequest 비동기 접근이 동시 성능을 향상시킬 수 있다고 하지만, 저는 동시 연결 개수를 바꾸지 않으면 동기식 또는 비동기식 접근 성능이 좋지 않다는 것을 테스트해봤습니다.

app.config에서 최대 동시 연결 수를 다음과 같이 설정할 수도 있습니다:

참고 기사

하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다.





이전의:Xshell Xftp 이 프로그램을 계속 사용하려면 최신 모델을 적용해야 합니다...
다음:Maven 명령어는 서드파티 jar 패키지를 Nexus 개인 저장소로 푸시합니다
2021-12-26 17:20:57에 게시됨 |
배우는 법을 배우세요。。。。。
2022-1-10 08:42:47에 게시됨 |
배우는 법을 배우세요。。。。。
2022-3-8 15:58:54에 게시됨 |
배우다...
 집주인| 2023-2-18 21:47:09에 게시됨 |
추가로, 해결책은

 집주인| 2023-3-10 21:21:15에 게시됨 |
web.config를 통해 구성하세요

면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com