mam dziwny problem z kodem serwera w pythonie - w pewnym momencie, gdy klientem w kółko zadaję pytanie(ok. tysiąca razy na sekundę) serwer nagle przestaje akceptować połączenia- nie daje przy tym żadnych ostrzeżeń, a po kilku-kilkunastu sekund później sam z siebie pozwala się znowu łączyć.
import socket
import thread
import sys
def recvall(newsock):
data=''
try:
while True:
new_data=newsock.recv(1024)
data+=new_data
if data[-4:]=="\\r\\n\\r\\n":
return data
except socket.timeout:
print 'timed out'
finally:
return data
def run(newsock,addr):
#print addr
newsock.settimeout(0.01)
result=recvall(newsock)
newsock.settimeout(None)
newsock.sendall(result)
newsock.close()
def open_sock(host,port):
try:
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((host,port))
return sock
except socket.error, (value,message):
if sock:
sock.close()
print "Could not open socket: " + message
sys.exit(1)
def start(host,port):
sock=open_sock(host,port)
sock.listen(5)
print 'Started on',port
i=0
while True:
i+=1
if i%1000==0:
print i
thread.start_new_thread(run, sock.accept())
start('',1234)
sprawdziłem czy problem nie leży przypadkiem po stronie wątków(które nie do końca mnie się podobają) wykonując kod synchronicznie(ten sam problem się zdarza) oraz zamieniając na fork(który strasznie się ślimaczył, przez co w sumie nie wiem czy tu też taka sytuacja występuje).
Jak pisałem w C takie rzeczy to się z takim czymś nie spotykałem, na prawdę nie wiem gdzie jest problem...
Może kolejka się zapycha lub na accept sobie czeka nie wiadomo na co? Jak to sprawdzić?
Zdarza się to dużo częściej jeśli klientów jest kilku i tak sobie pytają.