2010-11-15 10 views
5

Quiero probar el manejo de los tiempos de espera de mi aplicación al capturar datos a través de urllib2, y quiero tener algún modo de forzar el tiempo de espera de la solicitud.¿Cómo puedo forzar la finalización de urllib2?

A falta de encontrar una conexión a Internet muy lenta, ¿qué método puedo usar?

Me parece recordar una aplicación/suite interesante para simular este tipo de cosas. Tal vez alguien sabe el enlace?

+0

aquí hay un [ejemplo de código de 'slow_http_server.py'] (http://stackoverflow.com/a/32685765/4279) – jfs

Respuesta

10

que suelen utilizar netcat a la escucha en el puerto 80 de mi máquina local:

nc -l 80 

Luego utilizo http://localhost/ como URL de solicitud en mi aplicación. Netcat responderá en el puerto http, pero nunca dará una respuesta, por lo que se garantiza que expirará el tiempo de espera siempre que haya especificado un tiempo de espera en su llamada urllib2.urlopen() o llamando al socket.setdefaulttimeout().

+0

muy agradable. ¡Nunca pensé en eso! –

+0

Tuve que usar: nc -l -p 80 ¡Gran idea! Gracias. – mhost

+0

Sí, las versiones anteriores de netcat tienen opciones de línea de comandos ligeramente diferentes, IIRC. Me alegro de que funcionó! –

0

¿por qué no escribir una secuencia de comandos CGI muy simple en bash que simplemente duerme durante el tiempo de espera requerido?

3
import socket 

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

Si desea establecer el tiempo de espera para cada petición se puede utilizar el argumento de tiempo de espera para urlopen

+0

Una cosa a tener en cuenta es que el argumento de tiempo de espera para urlopen solo se agregó en Python 2.6 – mhost

6

Se puede establecer el tiempo de espera predeterminado como se muestra arriba, pero se puede usar una mezcla de ambos desde Python 2.6 en la que hay una opción de tiempo de espera en el método 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!" 

El tiempo de espera predeterminado para urllib2 es infinito , e importar el socket asegura que atrapará el tiempo de espera como excepción socket.timeout

0

Si está ejecutando en una Mac, speedlimit es muy bueno.

También hay dummynet. Es mucho más hardcore, pero también te permite hacer cosas mucho más interesantes. Aquí hay un pre-configured VM image.

Si ya se está ejecutando en una caja Linux, está netem.

Creo que he oído hablar de una herramienta basada en Windows llamada TrafficShaper, pero esa no he verificado.

Cuestiones relacionadas