비동기 파일 다운로드

이 문서에서는 웹에서 파일을 다운로드 하는 방법을 살펴보겠습니다. 이 작업은 WebRequest 및 WebResponse 클래스를 사용 하 여 너무 많은 노력 없이 수행 됩니다. 이러한 클래스는 웹에서 스트림으로 데이터에 액세스할 수 있는 메서드를 제공합니다. 따라서 스트림을 처리하는 데 사용할 수 있는 다양한 판독기/기록기 클래스를 사용할 수 있습니다. 파일을 다운로드하는 데 사용할 수 있는 두 가지 메커니즘이 있습니다. 작은 파일의 경우 동기 메커니즘을 사용할 수 있으며 응답 시간을 예측할 수 없는 서버에서 다운로드한 대용량 파일 또는 파일의 경우 비동기 메커니즘을 사용할 수 있습니다. 이 문서에서는 두 가지 방법을 모두 보여 드리겠습니다. 이 코드는 100,000개의 URL을 통해 느리지만 꾸준히 반복되어 병렬로 다운로드됩니다. 이 것을 실험하면 내가 선택하는 동시성의 수준이 정확히 중요하지 않은 것 같습니다. 나는 50의 동시성을 골랐을 때 최고의 성능을 발견했다. 50개의 동시 Tokio 작업을 사용하여 10만 개의 HTML 파일을 모두 다운로드하는 데 약 30분이 걸렸습니다.

서버에서 세 개의 다른 파일을 다운로드한다고 가정합니다. 우리가 순차적으로 그렇게하면 대부분의 경우 CPU가 유휴 상태이며 서버가 응답하기를 기다리고 있습니다. 응답 시간이 지배하면 총 실행 시간은 개별 응답 시간에 대한 합계로 지정됩니다. 개략적으로 그림 1에 표시된 것처럼 보입니다. 모든 비동기 다운로드 파일이 완료 될 때까지 어떻게 기다릴 것입니다. 그러나 이것에 대한 비동기는 무엇입니까? 이것은 일반 단일 스레드 코드처럼 읽습니다. 나는 한 가지 일을하고, 나는 또 다른 일을한다. 스트림에서 EndRead를 호출하고 스트림에서 읽은 바이트 수를 다시 가져옵니다.

EndRead는 차단 호출이며 이미 시작한 BeginRead 호출당 한 번 호출됩니다. 읽기 바이트 수가 0보다 크면 더 많은 데이터가 남습니다. 그렇지 않으면 모든 데이터가 도착했으며 스트림을 닫고 주 함수가 대기 중인 이벤트를 설정합니다. 데이터를 읽기 위해 비동기 메서드를 사용해야했던 것처럼 비동기 메서드를 사용하여 파일에 데이터를 작성해야하며, 그렇지 않으면 비동기 콜백 함수 내에서 호출을 차단해야합니다. 위에서 와 마찬가지로 WebRequest 개체를 만들지 만 GetResponse를 호출하는 대신 인터넷 리소스에 대한 비동기 요청을 시작하는 BeginGetResponse를 호출합니다. 응답 콜백 함수를 인수 중 하나로 지정합니다. 그런 다음 3 개의 HTML 파일을 병렬로 다운로드할 때까지 기다렸다가 3 개의 Tokio „작업”을 생성하고 모두 완료 될 때까지 기다립니다. (이를 위해서는 join_all 구현하는 Cargo.toml에 선물 운송을 추가해야 합니다.) 아래에서 동기 및 비동기 Http 호출을 모두 수행하는 코드를 찾을 수 있습니다. 우리는 BeginWrite에 의해 시작 된 비동기 쓰기 작업을 종료 하는 우리의 출력 스트림에 EndWrite 호출 합니다. EndWrite는 모든 데이터가 기록될 때까지 차단합니다.