Опитвам се да създам 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 сървър??