これまでのところ、(大きな) 成功なしで gevent を使用して TCP サーバーを作成しようとしています。問題は Windows 内にあると思います (以前に Windows のソケットで問題が発生したことがあります)。Windows7でPython2.7、gevent0.13を使用しています。これが私のコードです:
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)
しかし、この操作は明らかにブロックします。
また、gevent と を混ぜてみましspawn
たsock.setblocking(0)
。これで改善され、機能しましたが、一度に 300 を超える接続を処理することはできませんでした。
Linuxでいくつかのテストを行い、違いがあるかどうかを確認します。それまでの間、何かアイデアがあれば、遠慮なく私と共有してください。乾杯!
更新元のコードは、Ubuntu 12.04 で同じことを行います。では、gevent TCPサーバーをどのように実装すればよいですか??