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