Я пытался создать TCP-сервер с gevent без (какого-либо серьезного) успеха до сих пор. Я думаю, что проблема кроется в Windows (раньше у меня были проблемы с сокетами под Windows). Я использую Python2.7, gevent0.13 под Windows7. Вот мой код:
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()
Эта реализация похожа на ту, которую вы можете найти здесь:
http://blog.pythonisito.com/2012/08/building-tcp-servers-with-gevent.html
Теперь ошибок нет, и сервер работает правильно, однако ничего не читает (и, следовательно, не отправляет). Возможно ли, что sock.makefile()
некорректно работает под Windows7? А может проблема кроется в другом?
Я пытался заменить sock.makefile()
простым
while True:
line = sock.recv(2048)
но эта операция явно блокирует.
Я также пытался смешать spawn
gevent с sock.setblocking(0)
. Теперь это было лучше, и это работало, однако не могло обрабатывать более ~ 300 подключений за раз.
Я собираюсь провести несколько тестов на Linux и посмотреть, есть ли разница. А пока, если у вас есть идеи, не стесняйтесь поделиться ими со мной. Ваше здоровье!
ОБНОВЛЕНИЕ Исходный код делает то же самое в Ubuntu 12.04. Итак, как мне реализовать gevent TCP-сервер?