Pregunta

Soy nuevo en Python y de lectura de códigos de otra persona:

debería ser seguido por urllib.urlopen() urllib.close()? De lo contrario, se podría filtrarse conexiones, correcto?

¿Fue útil?

Solución

El método close se debe llamar a la resultado de urllib.urlopen, no en el propio módulo de urllib como usted está pensando (como usted menciona urllib.close - lo que doesn 't existe).

El mejor enfoque: en lugar de x = urllib.urlopen(u) etc, utilice:

import contextlib

with contextlib.closing(urllib.urlopen(u)) as x:
   ...use x at will here...

La declaración with, y el gestor de contexto closing, se asegurará un cierre adecuado, incluso en presencia de excepciones.

Otros consejos

Al igual que @Peter dice, fuera del alcance abrió URL será elegible para la recolección de basura.

Sin embargo, también en cuenta que urllib.py define:

 def __del__(self):
        self.close()

Esto significa que cuando el recuento de referencia para esa instancia llega a cero , su __del__ método será llamado, y por lo tanto su método close se llamará así. La manera más "normal" para el recuento de referencia para llegar a cero es simplemente dejar que la instancia ir fuera de alcance, pero no hay nada estrictamente le para de una del x explícita temprana (sin embargo, no llama directamente __del__ pero sólo disminuye el contador de referencias por uno).

Es ciertamente un buen estilo para cerrar de forma explícita sus recursos - especialmente cuando la aplicación se ejecuta el riesgo de usar demasiado de dichos recursos - pero Python limpiar automáticamente para usted si no lo hace hacer algo divertido como el mantenimiento (circular?) las referencias a casos que no necesitas más.

En sentido estricto, esto es cierto. Pero en la práctica, una vez (si) urllib sale del ámbito, la conexión se cierra por el recolector de basura automática.

Es, básicamente, hace necesidad de cerrar de forma explícita su conexión al utilizar IronPython . El cierre automático en ir fuera de alcance se basa en la recolección de basura. Me encontré con una situación en la recolección de basura no se ha ejecutado durante tanto tiempo que Windows se quedó sin enchufes. Estaba de votación un servidor web a alta frecuencia (es decir, tan alto como IronPython y la conexión permitiría, ~ 7 Hz). Podía ver las "conexiones establecidas" (es decir, enchufes en uso) subir y subir el Monitor de rendimiento. La solución fue llamar gc.collect() después de cada llamada a urlopen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top