2010-11-15 3 views
5

Je veux tester le traitement des délais d'attente de ma demande lorsque je saisis des données via urllib2, et je veux avoir un moyen de forcer la demande à l'expiration du délai.Comment puis-je forcer urllib2 à expirer?

À court de trouver une connexion Internet très très lente, quelle méthode puis-je utiliser? Je me souviens d'une application/suite intéressante pour simuler ce genre de choses. Peut-être que quelqu'un connaît le lien? Pourquoi ne pas écrire un script CGI très simple dans bash qui ne dort que pendant la période de timeout requise?

+0

Voici un [exemple de code de 'slow_http_server.py'] (http://stackoverflow.com/a/32685765/4279) – jfs

Répondre

10

Je l'habitude d'utiliser netcat pour écouter le port 80 de ma machine locale:

nc -l 80 

Ensuite, j'utilise http://localhost/ comme URL de demande dans mon application. Netcat répondra au port http, mais ne donnera jamais de réponse, de sorte que la demande est garantie pour expirer à condition que vous ayez spécifié un délai d'expiration dans votre appel urllib2.urlopen() ou en appelant le socket.setdefaulttimeout().

+0

très agréable. Je n'ai jamais pensé à ça! –

+0

Je devais utiliser: nc -l -p 80 Bonne idée cependant! Merci. – mhost

+0

Ouais, les anciennes versions de netcat ont des options de ligne de commande légèrement différentes, IIRC. Content que ça a marché! –

0

3
import socket 

socket.setdefaulttimeout(2) # set time out to 2 second. 

Si vous souhaitez définir le délai d'attente pour chaque demande, vous pouvez utiliser l'argument de délai d'attente pour urlopen

+0

Une chose à garder à l'esprit est que l'argument timeout pour urlopen n'a été ajouté que dans Python 2.6 – mhost

6

Vous pouvez définir le délai d'attente par défaut comme indiqué ci-dessus, mais vous pouvez utiliser un mélange des deux depuis Python 2.6 il y a une option de délai d'attente dans la méthode urlopen:

import urllib2 
import socket 

try: 
    response = urllib2.urlopen("http://google.com", None, 2.5) 
except URLError, e: 
    print "Oops, timed out?" 
except socket.timeout: 
    print "Timed out!" 

Le délai d'attente par défaut pour urllib2 est infinie , et l'importation de socket vous assure que vous allez attraper le délai d'attente en tant qu'exception socket.timeout

0

Si vous utilisez un Mac, speedlimit est très cool.

Il y a aussi dummynet. C'est beaucoup plus hardcore, mais ça permet aussi de faire des choses beaucoup plus intéressantes. Voici un pre-configured VM image. Si vous utilisez déjà une machine Linux, il existe netem. Je crois que j'ai entendu parler d'un outil basé sur Windows appelé TrafficShaper, mais celui que je n'ai pas vérifié.