2011-09-13 7 views
0

Je suis à la recherche d'une valeur de sommeil optimale pour recevoir des données à partir d'un socket non bloquant. Par exemple:sommeil d'appels non-blocage

while True: 
    data=s.recv(1024) 
    if not data: 
     time.sleep(10) #10ms 
    else: 
     pass #... 

Pas de sommeil entraînerait dans l'utilisation du processeur à 100%, de sorte que toute idée comment obtenir le meilleur utilisation du processeur et BANDWITH? Combien de temps a un sommeil pour que le CPU puisse faire un changement de thread?

Btw, est-il logique de définir le tampon du socket via SO_SNDBUF/SO_RECVBUF et de définir TCP_NODELAY ou ne doivent-ils pas être combinés?

+0

Unlearn le motif. À présent! Oubliez qu'une fonction 'sleep()' a jamais existé. Pour chaque utilisation de 'sleep()', il existe une autre méthode, plus appropriée. –

Répondre

2

Vous ne devriez pas faire vous-même. Utilisez l'appel select, avec un délai d'attente si vous avez besoin de votre code pour se réveiller de temps en temps même si aucune donnée n'a été reçue.

BTW, TCP_NODELAY est du côté émetteur, ne sera pas influencer vos read s.

+0

Dans mon cas, le socket commute les appels en lecture/écriture. recv/envoyer/envoyer/envoyer/recv/recv/... –

1

Utilisez select. Il va essentiellement faire une pause le programme et le réveiller quand il y a des données disponibles sur le socket.

+0

Je pensais que quand j'utilise select (...) les données peuvent être passées dans une socket non bloquante quand je reviens et essayons de les recevoir. –

+1

@Mister No. Où avez-vous eu cette idée? Vous ne pouvez pas perdre de données via une API vers TCP/IP, sauf si vous commettez des erreurs de programmation. – EJP

3

Si vous prévoyez d'utiliser sleep(), pourquoi ne pas utiliser simplement bloquer les prises?