사실 지금껏 아무 생각없이 감으로 비동기와 멀티스레딩을 구분해서 썼는데 최근 글들 보니까 이 둘간의 적절한 사용에 의문이 생김.
지금 상기해보면 확정적인 수의 작업을 동시에 실행하지만 성능향상은 기대하지 않을 때 예를 들어 파일스트림을 읽거나 쓸 때 비동기를 썼고
불확정적인 수의 루틴을 동시에 실행하거나 성능향상을 기대할 때 예를 들면 스레드 풀을 쓸 수준 이상이 될 때 쓰레드를 생성해서 썼던 거 같거든.
근데 문득 내가 잘 이해하고 적재적소에 잘 쓰고 있는 건가 의심이 됨. 비동기와 멀티스레드의 실제적인 동작 차이도 잘 모르겠고 막 헷갈리노.
비동기는 멀티스레드로 구현됨? 아님 서로 독립적인 거임?
멀티스레드 동작이 비동기적인 거 아님? 왜 비동기를 따로 구분해서 쓰는 거임? 간결함?
기존에 멀티스레드로 작성된 코드를 비동기로 완전히 대체했을 때 혹은 그 반대를 하면 문제점이 발생하기도 하나?
멀티쓰레드도 io작업 들어오면 쓰레드 코코낸내시키니까 비동기이라고 볼수 있남
파일을 읽거나 네트워크로 데이터 주고받거나 할때 일하는건 하드나 랜카드고 시퓨는 그동안 놀고있으니까 이때 다른거 시킬 수 있게 하는게 비동기고 영상처리나 기계학습처럼 무거운 연산작업을 여러개 해야될때 그걸 코어마다 나눠서 하는게 병렬화임
근데 비동기가 꼭 스레드를 여러개 두고 해야되는 건 아님. 히토미 다운로더에서 이미지 30장을 가져오는 상황을 생각해보자. 이때 (히토미 서버에 n번 이미지 요청 -> 응답 기다리기) 이런 스레드를 30개 만드는 것보다 (1번 이미지 요청 -> 2번 이미지 요청 -> ... -> 응답을 큐에 쌓아두고 기다리기) 이런 일을 하는 스레드 하나만으로도 충분하잖아
요청을 보내고 응답이 오기까지 시간 동안에는 그쪽 서버나 라우터가 일하는거지 이쪽 컴퓨터가 할 수 있는 일은 아무것도 없으니까 이때 한 스레드에서 여러 요청을 보내고 기다릴 수 있는거지(병렬화가 필요없음). 반대로 연산작업의 경우에는 여러 코어를 동시에 갈궈야만(=병렬화가 있어야만) 효율이 나오겠지
성능이 필요한 경우엔 비동기를 쓰면 안된다는 개념은 알겠음. 다른 IO 대역폭때문에 병목이 생기면 스레드가 여러 개인 이점도 없다는 것도 알겠음. 마지막 의문은 병렬화를 하면 성능 향상이 없더라고 비동기를 쓰는 목적을 똑같이 달성할 수 있을 텐데 둘을 구분하면 생기는 이점이 있음? 병렬화가 필요하지 않아도 병렬화로 동시성을 만족할 수 있잖아. 내가 고민해 봤을 땐 스레드를 생성할 때의 오버헤드나 스레드가 대기할 때에 어떤 성능상의 비효율이 있을 거 같긴 한데
ㅇㅇ 잘 알고있네. 스레드 만들고 없앨때 OS까지 왔다가고 이런 오버헤드가 있지. 그래서 스레드 풀도 만들고 하는거 아님
비동기 구현이 번거로움. 그리고 비동기도 내부적으로는 스레드를 사용함. 스레드는 굉장히 저수준의 개념이고 비동기는 추상적인 거임.
프로세스의 경량화(메모리 공간의 공유)가 스레드고, 스레드가 없다면 한 프로세스 내에서 병렬 실행을 구현할 수 없음.
나도 이렇게 생각했었는데 개념도 가물가물하고 알아봤을 땐 비동기는 싱글스레드에서 구현될 수도 있다고 하더라고? 비동기는 병렬 실행이 아니라서 싱글 스레드에서 동작할 수도 있다는데. In asynchronous single-threaded workflows you have a graph of tasks where some tasks depend on the results of others; as each task completes it invokes the code that schedules the next task that can run, given the results of the just-completed task. 이게 내가 참조한 스택오버플로 답변의 일부고 내가 이해를 잘못한건가? 저 싱글스레드 상의
동작이 실제로는 멀티스레드로 동작하는 거임?
흐름이 싱글스레드일 수는 있어도 스레드 생성이 필요함
비동기를 싱글 스레드에서도 할 수 있는데 보통 굳이 그렇게는 안하고 코어 수만큼 스레드 풀을 만들어서 그 풀에서 비동기를 돌리는 걸로 구현함. 만약 비동기 작업 수가 스레드 수보다 많게 되면 위에서 말했던 것처럼 한 스레드에서 여러 작업을 비동기적으로 처리하겠지