• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

asyncio와 await 키워

23.08.01 13:18 작성 조회수 152

1

bandicam 2023-08-01 13-13-41-403.jpgbandicam 2023-08-01 13-13-22-771.jpg

  1. 그림에서는 task가 2개 동시에 실행되는걸로 보이는데 왜 피피티에서는 single thread single process라고 하나요?

  2. bandicam 2023-08-01 13-14-03-484.jpgbandicam 2023-08-01 13-14-03-484.jpg2. await을 만나면 하던 태스크를 잠시멈춘다고했는데, await 뒤에 코드 ~sleep(1)까지 다 읽고 실행한 상태에서 멈추는건가요?

  3. 태스크와 스레드 차이점이 뭔가요? 똑같은 개념아닌가요?

답변 1

답변을 작성해보세요.

0

안녕하세요 남기정님,

  1. 그림에서는 task가 2개 동시에 실행되는걸로 보이는데 왜 피피티에서는 single thread single process라고 하나요?

=> 캡쳐하신 강의자료에, 이벤트 루프에서 CPU하나와 하나의 프로세스를 가지고 cooperative multi-tasking이라고 나와있지 않나요?

  1. await을 만나면 하던 태스크를 잠시멈춘다고했는데, await 뒤에 코드 ~sleep(1)까지 다 읽고 실행한 상태에서 멈추는건가요?

    => await은 문법이고, sleep자체가 명령어로 여기서 멈추는 것입니다.

  2. 태스크와 스레드 차이점이 뭔가요? 똑같은 개념 아닌가요?

    => 네 전혀 다른 개념입니다. Task는 어떠한 작업이고, Thread는 작업을 하는 행위자입니다.

 

남기정님의 프로필

남기정

질문자

2023.08.02

bandicam 2023-08-02 20-05-49-117.jpg2-1. 6번째줄 주석을 보면,await이라는 키워드를 만나자마자 이벤트루프로 돌아간다는건지 await키워드 뒤에 명령어 한줄을 보고나서야 이벤트 루프로 돌아간다는건지 이해를 못했어요.. await은 문법이고 sleep자체를 보고 멈춘거면, 다른 명령어여도 await 키워드 뒤에 명령어 한줄을 보고나서 멈춘다는 것이지요?

2-2. 그러면 async task, async main 이렇게 2개가 있는데 일단 큰 async main이 corountine이 되어서 이벤트루프에 던져져서 실행이 되는데, 이 큰 coroutine안에 asyncio.gather함수로 작은 coroutine들이 생성되어 이벤트루프에 던져지는건가요? 그러니까 큰 coroutine안에 작은 coroutine들이 있는구조여서 이 작은 coroutine들이 끝나야 비로소 큰 coroutine이 끝난다는거죠?

2-1. 6번째줄 주석을 보면,await이라는 키워드를 만나자마자 이벤트루프로 돌아간다는건지 await키워드 뒤에 명령어 한줄을 보고나서야 이벤트 루프로 돌아간다는건지 이해를 못했어요.. await은 문법이고 sleep자체를 보고 멈춘거면, 다른 명령어여도 await 키워드 뒤에 명령어 한줄을 보고나서 멈춘다는 것이지요?

=> 이 코드를 중심으로 해석하자면, await이라는 키워드와 그 다음 명령어인 asyncio.sleep을 보고 이벤트 루프로 돌아가서 할일이 있는지 확인한다고 생각하시면 될 듯합니다. 더 쉽게 설명하자면... 코루틴안에서 await 보면, "잠깐 기다려 나 이 일을 해야돼"라고 외치고, 이벤트 루프는 그럼 난 "다른 할일 없나"라고 찾아본다고 설명해야될까요?(이거 참 쉽게 설명하기 힘드네요 ㅋㅋ). 더 많은 예제를 원하시면 https://docs.python.org/3/library/asyncio-task.html을 보시면 될 듯합니다.

2-2. 그러면 async task, async main 이렇게 2개가 있는데 일단 큰 async main이 corountine이 되어서 이벤트루프에 던져져서 실행이 되는데, 이 큰 coroutine안에 asyncio.gather함수로 작은 coroutine들이 생성되어 이벤트루프에 던져지는건가요? 그러니까 큰 coroutine안에 작은 coroutine들이 있는구조여서 이 작은 coroutine들이 끝나야 비로소 큰 coroutine이 끝난다는거죠?

=> 네 잘 이해하셨습니다 ㅎㅎ

이게 코루틴이 설명하기가 워낙 애매모호해서... 어떻게 더 쉽게 설명해야 될지 생각해보고 수업 좀 업데이트 해야겠네요. 제가 리서치를 해봐도 그닥 쉽게 설명한 자료가 없네요.

일단 질문에 도움이 되었으면 좋겠네요!