지금까지 (모든 주요) 성공없이 gevent를 사용하여 TCP 서버를 만들려고했습니다. Windows에서 문제가 발생했다고 생각합니다. 이전에 Windows 소켓과 관련된 문제가있었습니다. 나는 Python2.7, Windows7에서 gevent0.13을 사용하고 있습니다. 그러나 그것은 읽는되지 않으며,Windows의 gevent TCP 서버
http://blog.pythonisito.com/2012/08/building-tcp-servers-with-gevent.html
지금 오류가없는 서버가 제대로 작동하는 것 같다 :
from gevent import socket
from gevent.server import StreamServer
def handle_echo(sock, address):
try:
fp = sock.makefile()
while True:
# Just echos whatever it receives
try:
line = fp.readline()
except Exception:
break
if line:
try:
fp.write(line)
fp.flush()
except Exception:
break
else:
break
finally:
sock.shutdown(socket.SHUT_WR)
sock.close()
server = StreamServer(("", 2345), handle_echo)
server.server_forever()
이 구현은 여기에서 찾을 수있는 것과 유사 : 여기에 내 코드입니다 (따라서 전송). Windows7에서 sock.makefile()
이 올바르게 작동하지 않을 수 있습니까? 아니면 문제가 다른 곳에있는 것일까 요?
나는이 작업을 분명히 블록을 간단한
while True:
line = sock.recv(2048)
와 sock.makefile()
를 교체하려고했지만했습니다.
또한 gevent의 spawn
과 sock.setblocking(0)
을 섞어 사용했습니다. 이제는 더 좋았고 효과적 이었지만 한번에 300 개 이상의 연결을 처리하지 못했습니다.
리눅스에서 몇 가지 테스트를하고 차이가 있는지 알아 보겠습니다. 그 동안 아이디어가 있다면 저와 공유해주십시오. 건배!
업데이트 원본 코드는 우분투 12.04에서 동일한 기능을합니다. 어떻게하면 gevent TCP 서버를 구현해야합니까 ??
믿을 수 없습니다. 나는 복잡한 것들에 너무 집중하여 분명히 놓쳤다. :) 예, 저는 항상 "핑 (ping)"을 보냈습니다. 나는 그것을 "ping \ n"'으로 변경했고 이제는 정상적으로 작동합니다! 고마워요! 그건 그렇고 : 자사의 성능을 자사의 스레드 버전의 성능과 비교했습니다 실제로 스레드 버전이 더 효율적입니다 보인다! 나는 여전히 잘못된 것을하고 있을지 모르지만 지금은 그 질문과 관련이 없다고 생각합니다. :) – freakish