Python에서 1000 개의 차단 TCP 연결을 유지하는 방법은 무엇입니까?

이것이 필요한 이유는 GPRS 모뎀이 연결된 1000 개의 장치에서 데이터를 폴링해야하고이 장치에 대한 클라이언트 프로토콜 구현에 차단 API가 있기 때문입니다.

<data> = protocol.get_<some_data>(stream)

모든 get 메서드는 차단됩니다. 데이터를 반환하거나 예외를 발생시킬 수만 있습니다. Stream은 GPRS 모뎀에서 앱으로 설정된 TCP 소켓 연결입니다. 프로토콜은 파이썬으로 구현됩니다. 프로토콜의 복잡성은 설명하기 어렵습니다. 특정 기능을 가진 약 100 가지 유형의 장치가 있으며 get 메소드가이를 인식하므로 프로토콜 구현은 예를 들어 go 또는 erlang으로 이식하는 것이 매우 복잡합니다 (이에 대해 그러한 금액을 요구할 것입니다). 내 상사가 울 것입니다). 따라서 질문은 파이썬에서 1000 스레드를 유지하는 방법처럼 들릴 수 있습니다. 나는 GIL (나는 현재 CPython을 사용한다)뿐만 아니라 OS가 제 3 차 세계 대전이 시작되었다고 느끼기 때문에 파이썬 가능성을 훨씬 뛰어 넘을 수 있다는 것을 알고 있습니다 (이 모든 것을 하나의 서버 시스템에서 가져올 계획이었습니다).

Jeremy Friesner

블로킹 I / O 만 사용해야한다고 가정하면 (예 : 비 블로킹 I / O를 사용하기 위해 다시 작성하기에는 너무 많은 기존 코드베이스가 있기 때문에) 가장 쉬운 방법은 단순히 1000 개의 스레드를 생성하는 것입니다. 대부분의 OS는 많은 스레드를 처리 할 수 ​​있으며 (비록 효율적으로 수행 할 수는 없지만) I / O를 기다리는 차단 된 스레드가 GIL을 보유하지 않기 때문에 GIL은 문제가되지 않습니다. (GIL은 CPU 바운드 계산을 병렬화하여 속도를 높이려는 경우에만 문제이며 모든 스레드가 I / O 바운드 인 것처럼 들립니다)

1000 개의 스레드가있는 프로세스가 실제로 선택한 OS에 너무 많은 스레드가 허용 가능하게 처리된다는 사실을 발견하면 항상 스레드를 여러 프로세스로 나눌 수 있습니다 (예 : 각각 100 개의 스레드가있는 10 개의 프로세스 또는 작동하는 다른 비율). 베스트). 그런 다음 문제가 전역 스레드 제한 문제로 판명되면 (예 : 프로세스 수에 관계없이 1000 개의 스레드가 너무 많음) 다음으로 할 수있는 일은 여러 컴퓨터에 분산시키는 것입니다 (예 : 10 각각 100 개의 스레드를 실행하는 컴퓨터).

하지만 이것들은 모두 추악한 해결책입니다. 실제 해결책은 각 스레드가 (잠재적으로 많은) 소켓 수를 동시에 처리 할 수 ​​있도록 비 블로킹 I / O를 사용하도록 프로그램을 다시 작성하는 것입니다. 아직 읽지 않았다면 많은 동시 TCP 연결을 잘 지원하는 주제에 대한 C10K 문제 기사 를 읽고 싶을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

GetExtendedTcpTable을 사용하여 Windows에서 TCP 연결의 원래 PID를 얻는 방법은 무엇입니까?

분류에서Dev

TCP 연결에 속하는 패킷을 DPDK의 특정 lcore로 보내는 방법은 무엇입니까?

분류에서Dev

Bash 자체에 의해 설정된 TCP 연결을 종료하는 방법은 무엇입니까?

분류에서Dev

이미 차단 중일 때 C의 TCP 서버를 차단 모드에서 비 차단 모드로 변경하는 방법 또는 차단 TCP 서버를 올바르게 종료하는 방법은 무엇입니까?

분류에서Dev

Trello 보드에서 1000 개 이상의 액션을 얻는 방법은 무엇입니까?

분류에서Dev

TCP 연결에서 Bind 방법을 사용하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

C ++에서 정수 단일 연결 목록의 대칭을 확인하는 방법은 무엇입니까?

분류에서Dev

ColdFusion에서 BULK 삽입을 사용하지 않고 한 번에 1000 개 이상의 레코드를 삽입하는 방법은 무엇입니까?

분류에서Dev

유형의 값을 정수에 순차적으로 연결할 수있는 방법은 무엇입니까?

분류에서Dev

Python으로 .txt 파일에서 처음 1000 개 또는 정의 된 단어 수를 가져 오는 간단한 방법은 무엇입니까?

분류에서Dev

콘솔을 사용하여 모든 TCP 연결을 종료 / 중단하는 방법은 무엇입니까?

분류에서Dev

현재 줄 위 / 아래에 1000 개 이상의 줄을 읽는 방법은 무엇입니까?

분류에서Dev

테이블에서 마지막 1000 개의 ID (99001에서 100000까지)를 유지하고 나머지를 삭제하는 방법은 무엇입니까?

분류에서Dev

Prism의 viewlocator를 사용하여 여러 ViewModel을 단일 View에 연결하는 방법은 무엇입니까?

분류에서Dev

Python의 단일 input () 함수에서 두 개 이상의 입력을 얻는 방법은 무엇입니까?

분류에서Dev

UI를 차단하지 않고 QGraphicsScene에서 약 1000 개의 항목을 이동하는 방법

분류에서Dev

Node.js에서 MongoDB에 연결하는이 두 가지 방법의 차이점은 무엇입니까?

분류에서Dev

단일 게시물을 WordPress의 thickbox에 연결하는 방법은 무엇입니까?

분류에서Dev

두 개 이상의 뷰에서 단일 뷰 모델을 공유하는 방법은 무엇입니까?

분류에서Dev

PyQt에서 pyqtSignal을 사용하여 2 개의 창을 연결하는 방법은 무엇입니까?

분류에서Dev

어패류에서 두 개의 무한 스트림을 연결하는 방법은 무엇입니까?

분류에서Dev

연결된 융합 차트에서 자식 차트의 유형을 수정하는 방법은 무엇입니까?

분류에서Dev

QML에서 두 개의 scrollview를 연결하는 방법은 무엇입니까?

분류에서Dev

차트의 Y 축에 더 많은 공백을 유지하는 방법은 무엇입니까?

분류에서Dev

R Shiny에서 2 개의 위젯 옵션을 동적으로 연결하는 방법은 무엇입니까?

분류에서Dev

Pyspark에서 두 개의 ArrayType (StringType ()) 열을 요소별로 연결하는 방법은 무엇입니까?

분류에서Dev

awk : 한 줄에서 2 개의 패턴을 추출한 다음 연결하는 방법은 무엇입니까?

분류에서Dev

두 개의 hstore postgresql에서 값을 연결하는 방법은 무엇입니까?

분류에서Dev

jexl에서 두 개의 숫자 문자열을 연결하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    GetExtendedTcpTable을 사용하여 Windows에서 TCP 연결의 원래 PID를 얻는 방법은 무엇입니까?

  2. 2

    TCP 연결에 속하는 패킷을 DPDK의 특정 lcore로 보내는 방법은 무엇입니까?

  3. 3

    Bash 자체에 의해 설정된 TCP 연결을 종료하는 방법은 무엇입니까?

  4. 4

    이미 차단 중일 때 C의 TCP 서버를 차단 모드에서 비 차단 모드로 변경하는 방법 또는 차단 TCP 서버를 올바르게 종료하는 방법은 무엇입니까?

  5. 5

    Trello 보드에서 1000 개 이상의 액션을 얻는 방법은 무엇입니까?

  6. 6

    TCP 연결에서 Bind 방법을 사용하는 가장 좋은 방법은 무엇입니까?

  7. 7

    C ++에서 정수 단일 연결 목록의 대칭을 확인하는 방법은 무엇입니까?

  8. 8

    ColdFusion에서 BULK 삽입을 사용하지 않고 한 번에 1000 개 이상의 레코드를 삽입하는 방법은 무엇입니까?

  9. 9

    유형의 값을 정수에 순차적으로 연결할 수있는 방법은 무엇입니까?

  10. 10

    Python으로 .txt 파일에서 처음 1000 개 또는 정의 된 단어 수를 가져 오는 간단한 방법은 무엇입니까?

  11. 11

    콘솔을 사용하여 모든 TCP 연결을 종료 / 중단하는 방법은 무엇입니까?

  12. 12

    현재 줄 위 / 아래에 1000 개 이상의 줄을 읽는 방법은 무엇입니까?

  13. 13

    테이블에서 마지막 1000 개의 ID (99001에서 100000까지)를 유지하고 나머지를 삭제하는 방법은 무엇입니까?

  14. 14

    Prism의 viewlocator를 사용하여 여러 ViewModel을 단일 View에 연결하는 방법은 무엇입니까?

  15. 15

    Python의 단일 input () 함수에서 두 개 이상의 입력을 얻는 방법은 무엇입니까?

  16. 16

    UI를 차단하지 않고 QGraphicsScene에서 약 1000 개의 항목을 이동하는 방법

  17. 17

    Node.js에서 MongoDB에 연결하는이 두 가지 방법의 차이점은 무엇입니까?

  18. 18

    단일 게시물을 WordPress의 thickbox에 연결하는 방법은 무엇입니까?

  19. 19

    두 개 이상의 뷰에서 단일 뷰 모델을 공유하는 방법은 무엇입니까?

  20. 20

    PyQt에서 pyqtSignal을 사용하여 2 개의 창을 연결하는 방법은 무엇입니까?

  21. 21

    어패류에서 두 개의 무한 스트림을 연결하는 방법은 무엇입니까?

  22. 22

    연결된 융합 차트에서 자식 차트의 유형을 수정하는 방법은 무엇입니까?

  23. 23

    QML에서 두 개의 scrollview를 연결하는 방법은 무엇입니까?

  24. 24

    차트의 Y 축에 더 많은 공백을 유지하는 방법은 무엇입니까?

  25. 25

    R Shiny에서 2 개의 위젯 옵션을 동적으로 연결하는 방법은 무엇입니까?

  26. 26

    Pyspark에서 두 개의 ArrayType (StringType ()) 열을 요소별로 연결하는 방법은 무엇입니까?

  27. 27

    awk : 한 줄에서 2 개의 패턴을 추출한 다음 연결하는 방법은 무엇입니까?

  28. 28

    두 개의 hstore postgresql에서 값을 연결하는 방법은 무엇입니까?

  29. 29

    jexl에서 두 개의 숫자 문자열을 연결하는 방법은 무엇입니까?

뜨겁다태그

보관