私はPythonでクライアントサーバーアーキテクチャを構築していますが、残念ながら、サーバーへの各リクエストが1つのTCP接続で表されるという元の設計が行われ、大きなグループ(20 000以上)でリクエストを送信する必要があり、ソケットエラーが発生することがあります#10055
。
Pythonでそれを処理する方法をすでに見つけました:
>>> errno.errorcode[10055]
'WSAENOBUFS'
>>> errno.WSAENOBUFS
10055
そして、そのエラーを処理して再接続できるコードを作成します (もちろん、サーバーに必要なことを実行する時間を与えるための遅延はほとんどありません)。
class MyConnect:
# __init__ and send are not important here
def __enter__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Try several reconnects
for i in range(0,100):
try:
self.sock.connect((self.address, self.port))
break
except socket.error as e:
if e.errno == errno.WSAENOBUFS:
time.sleep(1)
else:
raise
return self
def __exit__(self, type, value, traceback):
self.sock.close()
# Pseudocode
for i in range(0,20000):
with MyConnect(ip,port) as c:
c.send(i)
私の質問は次のとおりです。
- これを行うための「良い方法」はありますか?
e.errno == errno.WSAENOBUFS
マルチプラットフォームですか?そうでない場合、マルチプラットフォームにする方法は?
注:私はまだWindowsでのみテストしましたが、Linuxでも動作する必要があります。