我一直在嘗試使用gevent創建一個沒有任何(主要)成功的TCP服務器。我認爲問題在於Windows(我之前在Windows下有套接字問題)。我在Windows7下使用Python2.7,gevent0.13。這裏是我的代碼:Windows上的gevent TCP服務器
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
現在有沒有錯誤,服務器似乎正常工作,但它不讀書(並因此發送)任何東西。在Windows7下,sock.makefile()
可能無法正常工作嗎?或者問題可能在別的地方?
我試圖用簡單的
while True:
line = sock.recv(2048)
更換sock.makefile()
但這種操作顯然塊。
我也試圖混合gevent的spawn
和sock.setblocking(0)
。現在這個更好,它的工作,但它不能處理多達300個連接。
我打算在Linux上做一些測試,看看它是否有所作爲。與此同時,如果您有任何想法,請隨時與我分享。乾杯!
UPDATE原始代碼在Ubuntu 12.04下執行相同的操作。那麼我應該如何實現gevent TCP服務器?
令人難以置信。我一直專注於複雜的事情,而我卻錯過了那些顯而易見的事情。 :)是的,我一直髮送''ping''。我已經將它改爲'「ping \ n」',現在它應該可以正常工作!非常感謝你!順便說一下:我將它的性能與其線程版本的性能進行了比較,實際上似乎線程版本更高效!我可能仍然在做一些錯誤的事情,但我猜這跟現在的問題沒有關係。 :) – freakish 2013-03-05 19:47:14