inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)

async await 문법 질문

237

nathan

작성한 질문수 86

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 를 정의할때는 안 쓴것인지

 

이런 문법 자체가 궁금합니다. 혹시 이런것을 설명해주는 자료나 링크도 제공이 가능할까요?

 

 

 

python 동시성 FastAPI

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

nathan 님의 asyncawait 문법 관련 질문에 대해 비슷한 내용을 다룬 자료를 찾았습니다. 이 자료들은 async/await을 사용해 비동기 프로그래밍을 수행하는 방법과 관련 문법을 해설합니다.

특히, 질문하신 각 부분에서 asyncawait을 사용하는 이유에 대한 설명이 포함되어 있으니 참고가 되실 것 같습니다.

  1. (b) 부분에서 with 앞에 왜 async를 써야 하는지: 이는 async with 구문이 비동기 컨텍스트 매니저를 사용하도록 합니다. session.get(url)과 같은 비동기 연산을 수행할 때 이를 사용해야 비동기적으로 자원을 관리(예: 네트워크 연결 열고 닫기)할 수 있습니다.

  2. © 부분에서 await을 사용하는 이유: await 키워드는 비동기 연산이 끝날 때까지 기다려줍니다. response.text()는 비동기로 실행되는 함수이므로 그 결과를 기다린 후에 반환하려면 await을 사용해야 합니다.

  3. (d) 부분에서 async with을 사용하는 이유: 이는 aiohttp의 클라이언트 세션을 비동기적으로 사용하기 위함입니다. async with을 사용하면 세션 사용이 종료되면 자동으로 세션이 종료되도록 할 수 있습니다.

  4. (e) 부분의 await asyncio.gather(...) 사용 이유: awaitasyncio.gather 함수로 실행된 모든 비동기 작업이 완료될 때까지 기다려줍니다. 이렇게 함으로써, 주어진 모든 URL에 대한 요청이 비동기적으로 완료된 후에 결과를 result 변수에 저장할 수 있습니다. urls를 정의할 때 await을 사용하지 않는 이유는 urls의 생성이 비동기 작업이 아니라 단순한 리스트 생성이기 때문입니다.

위와 관련된 더 구체적인 설명과 예시는 아래 링크에서 확인하실 수 있습니다:
- 파이썬 동시성 관련 질문 - 동시성과 비동기 프로그래밍의 기초적인 개념을 설명하고 있습니다.
- 안녕하세요 ~ 파이썬 코루틴 활용 강의에 대해 질문이 있습니다. - 코루틴 사용에 대한 예시와 설명이 포함되어 있습니다.
- with 사용 - with 구문과 비동기 연산 사용에 대해 설명합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

대규모 크롤링 시 동시 요청 수 제어 방법

0

94

2

AWS LighSail 접근 불가

0

134

1

강의상의 readme와 배포되어 있는 것이 다른 것 같아요

0

96

1

book_scraper.py 에서 import get_secret 관련 질문

0

100

1

ThreadPoolExecutor 중간에 멈추는 법

0

291

1

몽고Db 기초 질문

0

195

1

멀티 스레딩 질문..

0

193

1

교안 제공은 안되나요?

0

227

1

TypeError: field Config is defined without type annotation

0

258

1

RuntimeWarning: Enable tracemalloc to get the object allocation traceback

0

1709

1

jinja2templates

0

244

1

몽고DB 설정 관련 질문

0

242

1

비동기 함수를 동기적인 실행으로 만드는 부분 질문입니다

1

308

2

proxy 사용 질문

0

261

1

AWS Lightsail SSL handshake failed 오류 문의드립니다.

0

491

1

동시성과 병렬성

0

326

1

python select linter ? 오류

1

739

2

수업질문

1

352

1

response 객체에서 키값으로 조회 시 KeyError 발생

0

568

1

from config import get_secret 질문

0

386

1

파이썬 코루틴활용 영상 질문

0

279

1

가상환경 설정 질문

0

316

1

pydantic import error

0

1225

2

동시성 프로그래밍으로 이미지 다운로더 개발

0

311

1