동기/비동기, 단일/멀티스레드 정리

๑⁰⊖⁰๑·2022년 2월 6일
1

코드는 원래 순차적으로 실행된다. 앞에 시간이 오래 걸리는 일이 있다고 했을 때 뒤 순서의 작업은 실행되지 못하고 기다린다.

이런 불편함을 개선하기 위해 동시적으로 처리하고 싶은 여러가지 해야 하는 작업이 있을 때 여러 일꾼에게 각각 맡기는 것이 멀티스레딩이다. 물론 cpu는 한번에 하나의 스레드만 실행시킬 수 있으므로 스레드를 바꿔가면서 작업을 처리한다.

그러나 컨텍스트 스위칭에는 비용이 많이 든다. 그래서 이벤트루프를 이용해서 단일스레드로도 비동기 방식으로 작업을 수행하는 방법이 사용된다. (상황에 따라 무엇을 적용할 것인지 판단)

  • 비동기 : 과제가 끝날 때 까지 기다리지 않고 실행하는 방법.

멀티 스레드에서는 방금 언급했듯이 스레드간 충돌이 없도록 추가 비용을 지불해야 한다. (개발자의 영역)

  • 자바는 단일 프로세스를 제공. 멀티 스레드 동기화를 위해 임계영역(lock)을 관리하는 synchronized 함수 제공.

  • 멀티스레드도, 순차처리방식이 있고 병행처리 방식이 있음. 멀티코어에서는 프로세스 하나당 하나씩 붙어서 병렬적으로 처리될 수 있고..

  • 스레드: 프로세스 내의 순차 흐름
    즉, 스레드는 작업자/ 비동기는 일 처리 방식이다. 비동기방식과 멀티스레드가 같다는 생각은 하지 말자. 이에 대해 잘 설명해놓은 글이 있다. C# 비동기 프로그래밍과 멀티 스레딩의 차이점은 무엇입니까?

django channels 의 syncConsumer 는 필요한 만큼 새 스레드를 생성하여 동기적으로 실행되는 방법, asyncConsumer 는 단일스레드로 비동기 방식으로 실행되는 방법이다.

  • 순차적으로 실행하는 동기 방식으로 스레드를 생성하여 병렬로 처리하는 방법 하나.
  • task 1 을 워커(not thread)에게 맡겨놓고 단일 스레드에서 메인스레드가 다른 일을 처리할 수 있게 하는 (이 기능을 구현하게 하는 것이 이벤트 큐) 방법 하나.
    애초에 멀티스레드 방식이 노는 스레드를 증가시켜서 context switching에 많은 비용이 드는 것에 대한 대안으로 비동기 방식이 등장했기 때문에 일꾼은 하나만 쓴다. 즉 단일 스레드만 제공된다. 다음은 내가 참고한 설명.

Yes, that is the intended design, as it's the safest way (it prevents race conditions if you're not aware of it). If you are happy to run messages in parallel, just spin off your own coroutines whenever you need them (using asyncio.create_task), making sure that you clean them up and wait for them on shutdown. It's quite a lot of overhead, so hopefully we'll ship an opt-in mode for that in the consumer in future, but for now all we ship with is the safe option.
출처 : https://stackoverflow.com/questions/52297958/how-to-multithread-asyncconsumer-with-django-channels

동시성/병렬성 프로그래밍, 교착상태
https://www.charlezz.com/?p=44650
[C#] 비동기 프로그래밍과 멀티 스레딩의 차이점은 무엇입니까?
http://daplus.net/c-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%BC-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%94%A9%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80-%EB%AC%B4%EC%97%87/
멀티스레딩과 비동기i/o에 대해
https://niklasjang.github.io/backend/multi-thread-vs-async-io/
멀티 스레드 / 비동기 병렬 처리
https://velog.io/@jjunyjjuny/%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC

[번역] 비동기 파이썬
https://mingrammer.com/translation-asynchronous-python/

profile
지독한 컨셉

0개의 댓글