해결된 질문
작성
·
28
·
수정됨
0
안녕하세요. 10강 내용 중 질문이 있습니다.
6분 20초 정도 시간대인데요.
위 코드의 106 line에서의 쓰레드가 2번 쓰레드일 경우, doSomething()
메서드 자체가 2번 쓰레드에서 실행된다고 말씀하셨는데요. doSomething()
메서드가 2번쓰레드에서 실행될지, 다른 쓰레드에서 실행될지는 알 수 없는 것 아닌가요? 즉, async 메서드가 실행되는 쓰레드와 await 호출 직전 시점의 쓰레드가 반드시 같지는 않을 수도 있는 것으로 알고있어서 질문드립니다.
감사합니다.
답변 2
1
네 안녕하세요 개발자 님.
네 맞습니다. 엄밀하게 따져보면, 개발자 님이 말씀하신게 맞습니다. 제 교재 29 페이지에도 보시면, 함수가 재개가 될때는 다른 쓰레드에서 재개가 될 수 있다고 그림까지 그려서 설명드리고 있기도 하고요.
다만, 여기서 그렇게 설명드리면, 이해할 수 없을 정도로 엄청 복잡해 지지 않을까요?
그래서 해당 설명 드리고 있는 부분에서는 Task 자체가 특정한 쓰레드에서만 실행된다고 가정을 해야, 이론적으로 이해하는 측면에서 훨씬 "직관적으로" 이해가 쉬워지기 때문에, 그렇게 가정하고 말씀드리고 있는 부분이니.. 강의 내용에서 그런 부분을 참고 부탁드립니다.
(실제로는 다른 쓰레드에서 재개(resume)되어 실행될 수 있다는 부분을 당연히 아신다는 (앞 부분의 강의 내용을 다 이해하시고 있다는) 가정 하에 최대한 직관적인 설명을 위한 가정일 뿐입니다.)
감사합니다. :)
0
안녕하세요, 인프런 AI 인턴입니다. 윤종님께서 제기하신 Swift Concurrency에서의 async/await 모델 관련 질문을 확인했습니다.
Swift의 async/await 모델은 비동기적으로 작업을 수행하며, 이는 특정 작업이 진행되는 동안 다른 작업에 스레드를 양보할 수 있게 합니다.
async/await의 동작 방식: 비동기 함수가 실행될 때 해당 함수는 “일시 중단(suspend)“되고, 이로 인해 컨텍스트 스위칭이 발생할 수 있습니다. 그래서 함수가 재개(restart)될 때 반드시 같은 스레드에서 실행된다고 보장할 수 없습니다.
await의 역할: await
키워드는 비동기 함수가 완료될 때까지 기다리는 작업을 수행합니다. 이는 해당 지점에서 현재 사용 중인 스레드를 양보할 수 있음을 의미합니다. 그래서 await
이후 코드가 재개될 때에는 동일한 스레드로 돌아온다는 보장이 없습니다.
따라서 doSomething()
메서드가 반드시 2번 스레드에서 실행된다는 보장은 없습니다. 스레드는 작업의 비중에 따라 스케줄러에 의해 동적으로 할당되기 때문입니다. 이는 Swift의 동시성 모델이 다루는 매우 중요한 개념으로, 항상 비동기 작업들이 어떤 스레드에서 실행되더라도 thread-safe 하도록 작성해야 함을 의미합니다.
추가적으로, Swift 공식 문서를 통해 Swift Concurrency의 동작 방식에 대해 더 자세히 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.