해결된 질문
작성
·
362
·
수정됨
0
안녕하세요 선생님!
동시성과 병렬성 관련해 기초가 약해 해당 강의를
들으면서 OS 부족한 부분을 많이 알게되어 도움이 많이되고 있습니다.
다름이 아니라 해당 강좌 범위는 벗어나지만..
구글링해도 명확하게 해결되지 않아 질문 드립니다.
동시성을 구현하는 방법으로
멀티쓰레드나 코루틴 방법으로 구현을 할 수있고
멀티쓰레드 방법에서 쓰레드 전환 간 context switch가 많기 때문에 오버헤드도 많아 Coroutine 방법을 많이 쓰고 또한 유저가 이벤트루프(스케쥴링)을 app에서 관리한다는 측면에서 디버그가 유용하다 정도로 이해하고 있습니다.
많은 블로그에서
멀티쓰레드보다 코루틴을 소개하면서 동시성 구현시 코루틴을 더 상위(혹은 좋은) 방법으로 서술이 많이 되어 있더라구요.
I/O작업이 빈번할 경우 코루틴이 더 유리하다는 이해가 됩니다.
싱글스레드 + async
싱글스레드
멀티스레드 + async
멀티스레드
2개의 구현방법이 레이어가 다르다(thread와 task)보니 4가지 경우의 수를 적용할 수 있는데 실제 동시성을 적용해야되는 상황이면 어떻게 판단하고 최적의 구현방법(4가지 중 선택)을 적용할 수 있을까요?
(파이썬 스택을 쓰고 있으며 GIL도 이해하고 있는 상태입니다.)
다시한번 해당 강의와 조금 벗어난 질문드려 죄송합니다.
( _ _ )
답변 1
0
'I/O 작업이 빈번할 경우 코루틴이 더 유리' 하다는 말의 큰 전제는 느린 I/O 입니다. 디스크 입/출력이나 네트워크 입/출력이 대표적이라 하겠습니다. 그리고 질문 중 이해가 되지 않는 부분은 '2개의 구현 방법이 레이어가 다르다'라는 말입니다. 제가 C/C++ 분야에 특화되어 더 그런 것 같습니다.
코루틴이 좋은 성능을 내는 이유는 Thread가 Wait할 일 없이 촘촘하게 연속적으로 연산할 수 있도록 하고 있기 때문입니다. 스레드 스위칭 오버헤드도 개선되고요. 아래 글을 참고하시기 바랍니다.
https://todaycode.tistory.com/179
그렇다면 사실 결론은 좀 나온 것과 같습니다. 당연히 멀티스레드 환경이어야 하며 그 과정에서 동기화는 필수 입니다. 따라서 '실제 동시성을 적용'한다는 말 자체는 의미가 없다고 하겠습니다. 참고하시기 바랍니다.:)