2008-10-21 7 views

Répondre

5

Witout regardant le code, j'attendre à ce que ce qui suit se produit:

  1. urlopen() ouvre la connexion et envoie la requête. Ensuite, le serveur commence à nourrir la réponse. À ce stade, les données s'accumulent dans les mémoires tampons jusqu'à ce qu'elles soient pleines et le système d'exploitation indique au serveur de patienter pendant un certain temps.
  2. Puis data.read() vide le tampon, de sorte que le système d'exploitation indique au serveur de continuer, et le reste de la réponse est téléchargé.

Bien entendu, si la réponse est assez courte, ou si le .read() arrive assez rapidement, les tampons n'ont pas le temps de remplir et le téléchargement se déroule en une seule fois.

+0

merci pour la réponse rapide – user20955

+0

Dans la documentation, il est indiqué: function renvoie un objet de type fichier. Donc je suppose que Ddaa a raison. – Mapad

+0

"File-like" fait simplement référence à l'interface offerte par l'objet. Ce que j'ai décrit si le comportement que vous obtenez naturellement hors des sockets TCP si toutes les données ne sont pas téléchargées dans le .urlopen(), ce qui serait vaincre le point d'une interface de type fichier. – ddaa

5

Je suis d'accord avec ddaa. Cependant, si vous voulez comprendre ce genre de chose, vous pouvez configurer un serveur fictif en utilisant quelque chose comme nc (dans * nix) et ensuite ouvrir l'URL dans l'interpréteur Python interactif.

Dans un terminal, exécutez nc -l 1234 pour ouvrir une socket et écouter les connexions sur le port 1234 de la machine locale. nc accepte une connexion entrante et affiche tout ce qu'il lit depuis le socket. Tout ce que vous tapez dans nc sera envoyé sur le socket à la connexion à distance, dans ce cas urlopen() de Python.

Run Python dans un autre terminal et entrez votre code, à savoir

data = urllib2.urlopen('http://127.0.0.1:1234') 
data.read() 

L'appel à urlopen() établira la connexion au serveur, envoyer la demande et bloquer en attente d'une réponse. Vous verrez que nc imprime la requête HTTP dans son terminal.

Tapez maintenant quelque chose dans le terminal qui exécute nc. L'appel à urlopen() bloquera toujours jusqu'à ce que vous appuyez sur ENTRÉE dans nc, c'est-à-dire, jusqu'à ce qu'il reçoive un nouveau caractère de ligne. Donc urlopen() ne reviendra pas tant qu'il n'aura pas lu au moins un nouveau caractère de ligne. (Pour ceux qui sont préoccupés tamponnage possible par nc, ce n'est pas un problème. urlopen() bloquera jusqu'à ce qu'il voit le premier caractère de nouvelle ligne.)

Il convient de noter que urlopen() va bloquer jusqu'à ce que le premier caractère de nouvelle ligne est reçue , après quoi les données peuvent être lues à partir de la connexion. En pratique, les réponses HTTP sont des réponses multilignes courtes, donc urlopen() devrait revenir assez rapidement.

Questions connexes