2011-09-19 2 views
2

나는 한 번에 여러 클라이언트를 수용 할 수있는 서버를 만드는 방법을 알아 내려고하고있다. 그렇게하는 동안 동시에 서버에서 데이터를 보내고받을 수있는 클라이언트가 필요합니다.동시에 파이썬에서 서버로 정보를 보내거나받는 중입니까?

스레드 서버를 만들어야합니까? 그리고 데이터를 듣기위한 스레드가 있어야합니다.

그런 다음 정보를 클라이언트에 보내는 또 다른 스레드는 무엇입니까?

그런 다음 클라이언트 측에서 정보를 보내고 받기 위해 스레드를 사용해야합니까?

답변

3

async IO를 사용하십시오. 파이썬을위한 비동기 IO 소켓 라이브러리가 12 개 있습니다. Here은 간단한 벤치 마크입니다. 나는 또한 gevent, eventlet, , twisted, pyev, pycurl, tornado을 테스트했습니다.

  • Twsited
    안정적하지만 대부분의 느리고도 시작하는 것은 쉽지 않다.
  • gevent, eventlet (libevent)
    쉽게 시작할 수 있고 빠르며 (코드는 차단 된 것처럼 보이지만) 분기하는 데는 몇 가지 문제가 있습니다.
  • pycurl (libcurl) 빠르며 쉽습니다 (플래그 마법을 사용하면 좋습니다 ...하지만 예제가 있습니다). http 만 있습니다.
  • pyev (libev)
    당신은 자신을 폴링하는 것과 거의 같은 일을 이해해야합니다.
  • 토네이도 (파이썬에서 투표)
    충분히 빠르고 안정적이며 쉽게 시작할 수 있다고 생각합니다.
  • asyncore
    정말 빠르고 .. 사용하지 마십시오. 못생긴입니다.

실제로 무엇을하고 있는지 알지 못하는 한 파이썬에서 스레드를 사용하지 마십시오. 파이썬과 스레드는 실제로 큰 친구가 아닙니다 (버전 번호 < 3.2에서 3.2는 새로운 길이어야합니다).

2

서버 쪽에서는 분명히 Socket Server이 필요합니다. 이 서버는 모든 수신 클라이언트 연결에 대해 새 스레드를 만듭니다.

일단 통신이 동기되면 소켓을 청취하는 것보다 다른 비즈니스를 병렬로 수행해야하는 경우 통신용으로 인스턴스화 된 클라이언트와 스레드 모두에 추가 스레드가 필요합니다. 비동기 통신이 필요한 경우 Python은 우수 Asynchronous Socket Handler을 제공합니다.

+0

따라서 비동기 서버에서 스레드가 필요하지 않습니까? –

+0

절대적으로 필요합니다. 그러나 소켓 서버와 같이 라이브러리 또는 프레임 워크에 캡슐화 할 수 있으므로 스레드 객체를 직접 조작 할 필요가 없습니다. – Santa

+0

소켓 서버를 비동기식으로 가져올 수 있습니까? 그리고 소켓 서버에서 무엇을 사용합니까? –

1

비동기 소켓을 사용하십시오. 예제 서버는 here이고 클라이언트 코드는 here입니다. 스레드에 직접적인 번거 로움이 없습니다. 필요에 따라 비동기 클라이언트가 필요하지 않을 수도 있습니다.

1

클라이언트 또는 서버에 스레드가 필요하지 않습니다. 대신()을 선택하여 단일 스레드 내의 모든 I/O를 멀티플렉싱 할 수 있습니다.

관련 문제