Python 3.5에서 Wait를 사용하는 시기와 제한 사항
Python 3.5의 비동기성은 주로 asyncio 라이브러리와 async/ 구문을 기다립니다. 이러한 구성을 언제 어디서 활용해야 하는지 이해하는 것은 비동기 애플리케이션의 성능을 최적화하는 데 중요할 수 있습니다.
await 사용 결정은 코드의 특성에 따라 달라집니다. 기본적으로 코드는 동기적으로 실행됩니다. 비동기성을 도입하려면 async def를 사용하여 함수를 정의하고 wait를 사용하여 호출할 수 있습니다. 그러나 당면한 작업에 동기 코드나 비동기 코드 중 어느 것이 더 적합한지 결정하는 것이 중요합니다.
일반적으로 I/O 작업을 처리할 때 Wait를 사용하는 것이 좋습니다. 네트워크 요청이나 데이터베이스 호출과 같은 I/O 작업은 본질적으로 비동기인 경우가 많으며 이를 이벤트 루프에 위임하면 크게 가속화될 수 있습니다.
예를 들어 다음 동기 코드를 고려해 보세요.
download(url1) # takes 5 seconds download(url2) # takes 5 seconds # Total time: 10 seconds
asyncio와 wait를 사용하면 동일한 코드를 비동기식으로 다시 작성할 수 있어 총 실행 시간이 더 오래 걸리는 시간으로 단축됩니다. 작업:
await asyncio.gather( async_download(url1), # takes 5 seconds async_download(url2), # takes 5 seconds ) # Total time: only 5 seconds (plus minimal asyncio overhead)
모든 비동기 함수는 필요한 경우 동기 코드를 자유롭게 활용할 수 있다는 점도 중요합니다. 그러나 타당한 이유 없이 동기 코드를 비동기 코드로 캐스팅하는 것은 본질적으로 어떠한 이점도 제공하지 않으므로 피해야 합니다.
비동기 코드와 관련하여 중요한 고려 사항 중 하나는 장기 실행 동기 작업으로 인해 전체 프로그램이 정지될 가능성이 있다는 것입니다. . 특정 임계값(예: 50밀리초)을 초과하는 동기 작업은 동시 비동기 작업을 차단할 수 있습니다.
이 문제를 완화하려면 해당 작업을 별도의 프로세스에 아웃소싱하고 결과를 기다릴 수 있습니다.
executor = ProcessPoolExecutor(2) async def extract_links(url): ... # If search_in_very_big_file() is a long synchronous operation, offload it to a separate process links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)
마지막으로 run_in_executor()를 사용하여 I/O 바인딩 동기 함수를 비동기 코드에 통합할 수 있다는 점에 주목할 가치가 있습니다. ThreadPoolExecutor와 함께 사용하여 다중 처리와 관련된 오버헤드를 최소화합니다.
위 내용은 Python 3.5 비동기 프로그래밍에서 언제 `await`를 사용해야 하며, 그 제한 사항은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!