비동기 파일 다운로드

스트림에서 EndRead를 호출하고 스트림에서 읽은 바이트 수를 다시 가져옵니다. EndRead는 차단 호출이며 이미 시작한 BeginRead 호출당 한 번 호출됩니다. 읽기 바이트 수가 0보다 크면 더 많은 데이터가 남습니다. 그렇지 않으면 모든 데이터가 도착했으며 스트림을 닫고 주 함수가 대기 중인 이벤트를 설정합니다. 데이터를 읽기 위해 비동기 메서드를 사용해야했던 것처럼 비동기 메서드를 사용하여 파일에 데이터를 작성해야하며, 그렇지 않으면 비동기 콜백 함수 내에서 호출을 차단해야합니다. 우리는 BeginWrite에 의해 시작 된 비동기 쓰기 작업을 종료 하는 우리의 출력 스트림에 EndWrite 호출 합니다. EndWrite는 모든 데이터가 기록될 때까지 차단합니다. 따라서 우리는 모든 데이터가 기록되었는지 확인하는 귀찮은 부분을 저장합니다. 당신이 볼 수 있듯이, 나는 이것에 대해 비동기는 무엇입니까 하지만 을 사용? 이것은 일반 단일 스레드 코드처럼 읽습니다. 나는 한 가지 일을하고, 나는 또 다른 일을한다. 아래에서 동기 및 비동기 Http 호출을 모두 수행하는 코드를 찾을 수 있습니다. 그러나 파서를 차단하는 동기 스크립트는 여전히 문제가 됩니다.

또한 추적 및 분석을 위한 스크립트와 같이 모든 스크립트가 사용자 경험에 똑같이 중요한 것은 아닙니다. 솔루션? 덜 중요한 스크립트를 비동기적으로 로드할 수 있도록 합니다. 아이디어는 스크립트를 실행하는 동안 DOM을 빌드하는 것이 안전하지 않더라도 HTML을 구문 분석하여 검색해야 하는 다른 리소스를 확인할 수 있다는 것입니다. 검색된 파일이 목록에 추가되고 병렬 연결의 백그라운드에서 다운로드를 시작합니다. 스크립트 실행이 끝날 때까지 파일이 이미 다운로드되었을 수 있습니다. 데이터 과학자들에게 가장 중요한 요소는 데이터입니다. 프로그램에 필요한 데이터를 어떻게 얻을 수 있을까요? 데이터베이스 쿼리, 디스크에서 파일 로드 또는 HTTP 요청을 통해 웹에서 데이터를 다운로드하는 것과 같은 일부 I/O 작업을 통해 이를 수행합니다. 이러한 I/O 작업은 데이터에 액세스할 수 있기를 기다리는 데 꽤 많은 시간이 걸릴 수 있습니다. 여러 파일을 로드하거나, 여러 데이터베이스 쿼리를 수행하거나, 여러 HTTP 요청을 수행해야 할 때 이 문제가 더욱 악화됩니다. 대부분의 경우 이러한 작업을 순차적으로 수행하므로 단일 작업을 실행하는 것보다 100배 더 오래 걸리는 총 100개의 I/O 작업을 실행합니다. 이제 기다리는 것은 성가신 일뿐만 아니라 진정한 고통이됩니다.

그러나 🙂 너무 오래 기다리지 말고 완전히 독립적 인 요청을 시작하기 전에 요청에 대한 응답을 기다리는 것이 합리적입니까? 또는 일상 생활의 예로 두 사람에게 이메일을 쓸 때 첫 번째 사람에게서 응답을 받을 때까지 두 번째 사람에게 이메일을 보낼 때까지 기다릴 까요? 그렇지 않은 것 같아요. 이 기사에서는 비동기 IO, 짧은 AsyncIO, 파이썬의 프로그래밍 패러다임을 사용하여 IO 바인딩 된 문제에 대한 대기 시간을 크게 줄이는 방법을 보여 드리고자합니다. 나는 기술적 인 세부 사항에 너무 많이 뛰어 들지 않고, 오히려 상당히 기본적인 유지하고 당신에게 잘하면 이해를 용이하게하는 작은 코드 예제를 보여줍니다. 서버에서 세 개의 다른 파일을 다운로드한다고 가정합니다. 우리가 순차적으로 그렇게하면 대부분의 경우 CPU가 유휴 상태이며 서버가 응답하기를 기다리고 있습니다. 응답 시간이 지배하면 총 실행 시간은 개별 응답 시간에 대한 합계로 지정됩니다. 개략적으로 그림 1에 표시된 것처럼 보입니다. 이 코드는 100,000개의 URL을 통해 느리지만 꾸준히 반복되어 병렬로 다운로드됩니다. 이 것을 실험하면 내가 선택하는 동시성의 수준이 정확히 중요하지 않은 것 같습니다. 나는 50의 동시성을 골랐을 때 최고의 성능을 발견했다. 50개의 동시 Tokio 작업을 사용하여 10만 개의 HTML 파일을 모두 다운로드하는 데 약 30분이 걸렸습니다. 3 개의 HTML 파일을 병렬로 다운로드하려면 3 개의 Tokio “작업”을 생성하고 모두 완료 될 때까지 기다립니다.

No Comments

Sorry, the comment form is closed at this time.

Chat Support