구현 내용 자체는 언어나 환경별로 각기다름.
C# 에서 async await은 뒤에 들어가는 내용에 따라서 멀티스레드로 들어가기도 하고, iobound(소켓,http통신,파일처리) 작업의 경우에는 프로세스 내에서 멀티스레드가 아니라 os한테 맡김
js나 dart는 이벤트루프로 비동기 구현이고
다만 추상적인 내용은 같다. await 으로는 작업(task future promise) 의 결과를 받은 뒤에 그다음 코드로 넘어간다.
- dc official App
await connect/send/receive+async로 비동기 함수를 await해서 사용하면 그냥 단순 connect/send/recieve로 blocking돼서 사용하는거랑 무슨 차이가 있음?
본 스레드는 어쨋거나 해당 함수가 처리되길 대기중인 상태인거고 connect/send/receive 받을 때까지 아무것도 못하는건 마찬가지 아님? GPT는 자꾸 암튼 비동기라 다름 이러던데
일단 파이썬에선 단일 스레드 내에 이벤트 루프가 정의되고 await하면 루프내에 다른 태스크가 cpu 가져감 - dc App
비동기작업 여러개를 await로 이어붙이면 하나의 거대한 비동기 작업이 된다고 생각하면 됢
말 그대로 이어붙인 작업들 끼리의 선후관계만 정해지는거지 전체가 블락된다거나 하지 않음
나는 여기서 기다릴테니까 너네는 알아서 할거하고있어봐~ 같은 느낌 - dc App
C#에서는 await ReceiveAsync하면 본 스레드는 시작시켜놓고 다른거 처리하러감. receive 받으면 커널에서 완료 시그널 트리거가 올라오고 닷넷이 지정한 스레드에서 코드를 계속 수행함. 커널-드라이버-하드웨어까지 비동기 모드가 구현되어있으면 그걸 사용함. 내가 알기로는 이럼. I/O같은거 말고 그 외에 다른건 닷넷 내부에 있는 이벤트루프 비슷한게 있음. 이건 JS나 파이썬에서 하는 동작과 비슷할듯
EventArgs (IOCP) 말고 그냥 버퍼에 수신 바이트 담는 단순한 에코서버 같은거 구현해도 그럼?
위에 댓글에 잘못된내용 닷넷 내부에 기본적으로 비동기 처리를 위한 이벤트 루프같은건 없음. Task.run 같은거 오래걸리는 cpu작업할때 쓰는데 걍 멀티스레드임 - dc App
닷넷 내부에 이벤트루프 비슷한거라고한건 nodeJS의 이벤트루프와 동일한 동작방식을 말한건 아님. CLR의 이벤트소스를 이용하는것도 있는데 자세한건 모르겠음. 그리고 ThreadPoolQueue도 쓰고 커널의 타이머 이벤트로 사용됨. 함수가 어떤 기능을 하냐에 따라서 await를 구현하는 방법 종류가 여러가지임. 단순히 멀티스레드라고 말하기에는 멀티스레드가 아닌것도 많다고
내가 소스 찾아가면서 정체가 뭔지 알아보다가 알게된것들임. 맨 밑바닥 근원까지는 못 갔지만, 그냥 스레드였으면 금방 thread pool 사용하는 코드가 나오는데, 스레드 같은게 나오지 않고 무슨 이벤트소스, 커널API 같은것들로 귀결되는 코드가 상당히 많더라. 아무리 thread pool이 준비되어있다지만 커널에서 적합한 기능을 제공해주는걸 활용하는게 더 좋으니까 그렇게 만들어놨을듯?
게임 클라 개발일 해보면 걍 통달하게됨ㅋㅋ 안쓰는데가 없어가지고.. - dc App
언리얼 울고 감
그냥 풀링이나 이벤트루프 이런거 모르는애들이 특히나 하는 환상같은거임