gevent TCP-сервер в Windows

Я пытался создать 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-сервер?


person freakish    schedule 05.03.2013    source источник


Ответы (1)


Что вы отправили на сервер? Убедитесь, что он завершается символом новой строки. В противном случае readline() не будет работать.

Вы также можете использовать tcpdump или wireshark, чтобы увидеть, что происходит на уровне TCP, если вы считаете, что делаете правильные вещи в своем коде.

person zzk    schedule 05.03.2013
comment
Невероятный. Я был так сосредоточен на сложных вещах, что пропустил очевидное. :) Да, я все время отправлял "ping". Я изменил его на "ping\n" и теперь он работает как надо! Большое спасибо! Между прочим: я сравнил его производительность с производительностью его многопоточной версии, и действительно кажется, что многопоточная версия более эффективна! Возможно, я все еще делаю что-то не так, но я думаю, что сейчас это не связано с вопросом. :) - person freakish; 05.03.2013