2012-02-24 3 views
2

첫 번째 문제는 오래 전부터 lurker이지만 처음 사용자인데 사이트를 만드는 데 모두 감사드립니다!독점 프로토콜 (Python, select, epoll)에 대한 수명이 긴 다중 스레드 클라이언트

독점 프로토콜의 클라이언트 부분을 구현해야하는 상황에 처해 있습니다. 프로토콜은 아래에 TCP/IP를 사용하여 다음과 같이 메시지 흐름이 요약 될 수있다 :

  1. 클라이언트가 서버에 연결
  2. 클라이언트는 특정 유형의 데이터에 대한 관심을 표현
  3. 서버가 이러한 데이터가 있으면 이 클라이언트는
  4. 클라이언트가 지금은 여전히 ​​같은 유형
  5. 서버의 데이터에 관심이 서버를 말할 필요가 서버에 수신을 확인하는 클라이언트로로 데이터를 전송
  6. 클라이언트에 내려 보내 들어오는 중
  7. 클라이언트는 수시로 서버에 응용 프로그램 수준의 연결 유지 요청을 보내야합니다 (매분마다)
  8. 서버의 일부 메시지는 클라이언트가 응답을 다시 보내야합니다. 서버
  9. 클라이언트는 모든이가 장수 하나를 일종의 웹 소켓처럼 내가 상상할 수있는 하나의 TCP 세션 내에서 발생하는 것입니다

을 끊습니다.

또 다른 점은 클라이언트가 멀티 스레드 서버에 배포되어야하며 여러 스레드로부터 동시에 액세스 할 수 있어야한다는 것입니다. 즉, 단일 스레드가 특정 유형의 메시지를 '구독'할 수 있어야합니다. 서버와 메시지를 보낼 수도 있어야합니다.

저는 GIL을 잘 알고 있기 때문에 그것에 대해 논평하는 것은 그리 좋지 않습니다. 저는 클라이언트 만 쓰고 있습니다. 아키텍처의 다른 부분은 변경할 수 없습니다.

그래서 HTTP 수준 아래에서 탐구 할 필요가 없었습니다. 항상 기존의 라이브러리를 사용하기에 충분히 운이 좋았지 만, 많은 네트워크 프로그래밍을 수행하지는 않았지만, 내가 처음으로 그런 모습이 될거야.

나는 select, epoll, libev 또는 gevent와 같은 모든 비동기 라이브러리/툴/툴킷에 대해 더 많이 배울 수있는 기회가되고 싶습니다.

웹상의 리소스 대부분이 서버 작성과 관련되어 있으며 멀티 스레드에 클라이언트를 배포 할 것이라는 확신이 들지는 않습니다. 많이해라. 모든 서버 사람들은 분명히 단일 스레드이지만, 다중 스레드가 필요하지 않거나 epoll과 같은 것들이이를 사용하는 다중 스레드를 좋아하지 않기 때문에이 스레드가 필요한지 확실하지 않습니다.

서버는 모든 클라이언트를 단일 스레드 장치처럼 취급하므로 명확하게 클라이언트에 대한 액세스를 직렬화해야한다고 생각합니다. 내가 얻을 수없는 것은 서버 응답이 스레드와 일치하는지 확인하는 방법입니다. 한 스레드가 메시지를 받았지만 다른 스레드가 메시지를 확인하기 전에받은 메시지를 확인해야 할 경우 메시지가 어떻게 섞이지 않을지 어떻게 확신 할 수 있습니까?

당신은 어떻게 생각하십니까? 이 경우 비동기 라이브러리가 좋은 선택입니까?내가 볼 수있는 코드 샘플을 생각해 볼 수 있습니까? 저는 Python을 사용하고 있습니다. 그러나 제가 생각하기에는 영감을 얻기 위해 C, C++ 또는 Java를 사용할 수있을 정도로 충분히 일반적인 것입니다.

많은 분들께 감사드립니다.

답변

0

각 스레드 (각 클라이언트)가 자체 소켓을 열 수 있습니까? 이 경우 모든 문제는 발생하지 않습니다. 한 스레드의 클라이언트 만 소켓에 핸들을 가지고 있으므로 자동으로 서버에서 올바른 데이터를 가져옵니다. 서버의 경우 클라이언트의 이러한 모든 연결은 완전히 독립적 인 클라이언트 연결처럼 보입니다 (정확히 똑같습니다).

요구 사항 중 하나가 전체 네트워크 연결 수를 제한하는 경우 서버 연결을 유지하고 다양한 스레드의 통신 요청을 로컬에서 수신하는 특수 스레드를 구성 할 수 있습니다. 그러나 독립 소켓 하나의 스레드 당 하나)는 아마 훨씬 간단합니다.

절대적으로 응용 프로그램 수준의 KeepAlive를 사용해야합니까? 왜냐하면 TCP가 자동으로 이것을 할 수 있기 때문입니다. keepalive가 시간 내에 수신되지 않으면 소켓이 닫히고 상대방에게 연결 시간이 초과되었음을 알립니다. 귀하의 경우 가능하다면 이것을 선택 사항으로 생각하십시오.

마지막으로 응용 프로그램 수준의 Keepalive를 수행 할 필요가 없다면 멀티 스레드 프로그래밍의 장점 중 하나를 활용할 수 있습니다. 각 스레드를 거기서 유일한 스레드로 개발하고 비동기에 대해서는 전혀 걱정할 필요가 없습니다. 예를 들어, 클라이언트가 요청을 보내도록 작성한 다음 resonance 기다림을 차단하고 계산을 수행 한 다음 결과를 보내거나 서버의 더 많은 데이터가 도착했는지 확인할 수 있습니다. 서버 측의 데이터가 여러분 측의 TCP 수신 창에 누적됩니다. 이는 또한 흐름 제어의 수단으로도 사용됩니다. 클라이언트가 너무 느려지고 수신 창이 가득 차면 서버가 더 이상 보낼 수 없습니다. 이렇게하면 서버를 차단할 수 있으므로 서버가이 상황을 처리 할 수 ​​있는지 여부를 확인해야합니다.