nspkk
130
2020-05-24 00:22:48
8
207

파이썬 소켓 채팅을 구상중입니다 논블로킹vs멀티쓰레드


파이썬으로 소켓 채팅을 구상중인데요


구상은 완료했는데 교수님이 추가로 생각해보라고 한 내용 중에 만약 동접자가 1만명 2만명이 됐을 때

논블로킹과 멀티쓰레드 중 어느 방식이 더 나을지 생각해보라고 하셔서 제 생각을 적고 답을 여쭤보고 싶습니다.


논블로킹은 select를 이용해서 서버 소켓과 각 클라이언트와 연결된 커넥션 소켓들을 한 곳에서 처리하기 때문에 한곳에서 부하가 심할 것 같고.


멀티쓰레딩은 각 쓰레드가 연결 하나를 맡기 때문에 그 부분에서는 괜찮지만 마찬가지로 쓰레드가 너무 늘어나는 경우 서버에 부담이 될 것 같습니다. (쓰레드가 여럿 도는데... 그렇지 않을까요?)


그래서 제 생각에 하나는 쓰레드하나에 부하가 몰리는 거고 하나는 너무 많은 쓰레드들이 돌아가서 부하가 될 것 같은데 어떤 게 더 정답에 가까울까요?( 질문 수준이 낮다면 죄송합니다)

0
0
  • 답변 8

  • 시닙이
    854
    2020-05-24 00:36:55
    멀티 쓰레딩이 더 좋아보입니다 ㅎ
    1
  • 안드개발자
    537
    2020-05-24 01:08:32

    가장 정답에 가까운건,,,

    서버 스펙에 따라 다르다.

    서버 사용 리소스가 많다 -> 멀티쓰레드 

    한정적이다->논블로킹

    일것같네요 ㅋㅋ


    논 블로킹의 경우는 지연되더라도 터지진 않을수 있는데 

    멀티쓰레드는 서버가 터져버릴수도 있지 않나요 ㅋㅋ


    1
  • 시닙이
    854
    2020-05-24 01:15:43
    로드밸런서 끼고 클러스터링도 한번 알아보시면 좋을듯합니다 ㅎㅎ 
    1
  • nspkk
    130
    2020-05-24 01:37:05

    좋은 답들 감사합니다!!!

    역시 큰 서버일 경우 큰 서버만의 답이 있겠죠

    0
  • 엡실론
    1k
    2020-05-24 01:57:38

    굳이 하나만 택해야 하나요. 섞어서 논블로킹으로 멀티쓰레드. 요즘엔 비동기가 대세죠.

    몇가지 생각해 볼 점은 cpu-bound인가, io-bound인가. io-bound면 멀티 스레드의 이점이 별로 없습니다.

    python 한정으로는 gil 때문에 멀티스레드가 멀티스레드가 아닐 경우도 생각해 봐야죠.

    1
  • aladdin56
    133
    2020-05-24 06:55:11

    실제는 섞어서 씁니다.

    Node V8 엔진이나, 웹서버 Nginx의 엔진 모두 이 점에서 비슷합니다.

    Select <=>  Queue <=> Thread Pool ( 기본적인 값은 8개의 Thread 로 구동을 시작합니다)



    1
  • 데브폐인
    5
    2020-05-24 19:38:07

    실제에서는 섞어서 씁니다.(비동기 + 멀티 쓰레드가 최적의 조합입니다. netty 엔진 처럼 말이죠^^)

     

    교수님의 질문만 기준으로 답변을 드린다면, 

    비동기와, 멀티쓰레드(비동기가 아닌 동기 환경이라면) 두가지 환경중 동접자 1만 이상을 처리할수 있는 방법은 무엇인가?

    정답: 비동기 입니다.


    멀티 쓰레드 동기 방식이 이전 Java버전에서 소켓을 구현하는 방식이었습니다.(jdk 1.4 NIO 이전)

    Socket 동기 방식 멀티 쓰레드에서 1천명도 구현이 쉽지 않습니다. 멀티 쓰레드와 동기 방식이 섞이면, 경쟁관계가 심해지고, 데드락이 발생활 확률이 비례하여 늘어납니다.

    비동기에선 1만명은 어렵지 않는 수치입니다. 데드락은 쓰레드간 경쟁이 없으니 발생할 이유가 없죠.    


    싱글 쓰레드에서 비동기 만으로 비지니스 로직 설계가 어렵습니다. db에 데이타를 넣어야 하고, 로직간 트랜젝션이 필요한 경우도 있고(billing???).  




    3
  • nspkk
    130
    2020-05-24 22:02:04

    아 이제야 확인했네요 질문 후에 검색했더니 좋은 블로그 글을 찾았습니다.


    채팅같은 경우 하나하나씩 쓰레드 생성하면 배보다 배꼽이 커지는 경우라더군요.


    그래서 파일전송같은 경우에만 쓰레드를 사용하도록 섞어쓴다고 알게 되었습니다.


    친절한 답변들 정말 감사드립니다

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.