작성
·
72
0
선생님 안녕하세요
좋은 강의 감사합니다.
async await 등의 문법 관련해서 질문이 있습니다.
코루틴을 만들때 언제 async 나 await을 써야하는지 잘 이해가 되지 않고, 인터넷을 찾아봐도 이해가 잘 되지 않습니다. 이것을 설명하는 자료나 공식문서가 따로 있나요?
예를 들어, 4-2 코드 파일에서
# (a) 부분
async def fetcher(session, url):
async with session.get(url) as response: # (b) 부분
return await response.text() # (c) 부분
async def main():
urls = ["https://naver.com", "https://google.com", "https://instagram.com"] * 10
async with aiohttp.ClientSession() as session: # (d) 부분
# (e) 부분
result = await asyncio.gather(*[fetcher(session, url) for url in urls])
"비동기 함수를 만들때 def 앞에 async 라는 것을 쓰는 것이다" 는 이해를 하겠는데,
예를 들어 (b) 부분에서 with 앞에 왜 async를 써야 하는지 (함수를 정의할때 async를 썼는데 왜 함수 안의 with 절 앞에 또 async를 써줘야 하나요?) ,
(c)에서 response.text() 앞에 왜 await을 써줘야 하는지 (async로 정의된 함수안에는 await을 무조건 써줘야 하나요? 그럼 모든 줄에 await을 써줘야 하나요? 아니라면 await을 써주는 줄과 안써주는 줄은 어떻게 구분하죠?)
(d) 에서도 왜 async를 써주는지,
(e) 에서는 await을 정의해주면서 왜 그 위에 urls 를 정의할때는 안 쓴것인지
이런 문법 자체가 궁금합니다. 혹시 이런것을 설명해주는 자료나 링크도 제공이 가능할까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
nathan 님의 async
와 await
문법 관련 질문에 대해 비슷한 내용을 다룬 자료를 찾았습니다. 이 자료들은 async
/await
을 사용해 비동기 프로그래밍을 수행하는 방법과 관련 문법을 해설합니다.
특히, 질문하신 각 부분에서 async
와 await
을 사용하는 이유에 대한 설명이 포함되어 있으니 참고가 되실 것 같습니다.
(b) 부분에서 with
앞에 왜 async
를 써야 하는지: 이는 async with
구문이 비동기 컨텍스트 매니저를 사용하도록 합니다. session.get(url)
과 같은 비동기 연산을 수행할 때 이를 사용해야 비동기적으로 자원을 관리(예: 네트워크 연결 열고 닫기)할 수 있습니다.
© 부분에서 await
을 사용하는 이유: await
키워드는 비동기 연산이 끝날 때까지 기다려줍니다. response.text()
는 비동기로 실행되는 함수이므로 그 결과를 기다린 후에 반환하려면 await
을 사용해야 합니다.
(d) 부분에서 async with
을 사용하는 이유: 이는 aiohttp의 클라이언트 세션을 비동기적으로 사용하기 위함입니다. async with
을 사용하면 세션 사용이 종료되면 자동으로 세션이 종료되도록 할 수 있습니다.
(e) 부분의 await asyncio.gather(...)
사용 이유: await
은 asyncio.gather
함수로 실행된 모든 비동기 작업이 완료될 때까지 기다려줍니다. 이렇게 함으로써, 주어진 모든 URL에 대한 요청이 비동기적으로 완료된 후에 결과를 result
변수에 저장할 수 있습니다. urls
를 정의할 때 await
을 사용하지 않는 이유는 urls
의 생성이 비동기 작업이 아니라 단순한 리스트 생성이기 때문입니다.
위와 관련된 더 구체적인 설명과 예시는 아래 링크에서 확인하실 수 있습니다:
- 파이썬 동시성 관련 질문 - 동시성과 비동기 프로그래밍의 기초적인 개념을 설명하고 있습니다.
- 안녕하세요 ~ 파이썬 코루틴 활용 강의에 대해 질문이 있습니다. - 코루틴 사용에 대한 예시와 설명이 포함되어 있습니다.
- with 사용 - with
구문과 비동기 연산 사용에 대해 설명합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.