python - ¿Son seguros los hilos urllib2 y httplib?
thread-safety (1)
httplib
y urllib2
no son seguros para subprocesos.
urllib2
no proporciona acceso serializado a un objeto OpenerDirector
global (compartido), que es utilizado por urllib2.urlopen()
.
De forma similar, httplib
no proporciona acceso serializado a los objetos HTTPConnection
(es decir, mediante el uso de un grupo de conexión seguro para subprocesos), por lo que compartir objetos HTTPConnection
entre subprocesos no es seguro.
Sugiero usar httplib2 o urllib3 como una alternativa si se requiere seguridad de subprocesos.
Generalmente, si la documentación de un módulo no menciona la seguridad de subprocesos, supongo que no es seguro para subprocesos. Puedes mirar el código fuente del módulo para verificarlo.
Al explorar el código fuente para determinar si un módulo es seguro para subprocesos, puede comenzar por buscar usos de primitivas de sincronización de threading
multiprocessing
módulos de threading
o multiprocessing
, o el uso de la queue.Queue
.
ACTUALIZAR
Aquí hay un fragmento de código fuente relevante de urllib2.py
(Python 2.7.2):
_opener = None
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
global _opener
if _opener is None:
_opener = build_opener()
return _opener.open(url, data, timeout)
def install_opener(opener):
global _opener
_opener = opener
Hay una condición de carrera obvia cuando los subprocesos concurrentes llaman a install_opener()
y urlopen()
.
Además, tenga en cuenta que llamar a urlopen()
con un objeto Request
como el parámetro url
puede mutar el objeto Request
(consulte la fuente de OpenerDirector.open()
), por lo que no es seguro llamar concurrentemente a urlopen()
con un objeto Request
compartido.
urlopen()
todo esto, urlopen()
es seguro para subprocesos si se cumplen las siguientes condiciones:
-
install_opener()
no se llama desde otro hilo. - Se utiliza un objeto de
Request
no compartido , o una cadena como el parámetrourl
.
Estoy buscando información sobre seguridad de subprocesos de urllib2 y httplib. La documentación oficial ( http://docs.python.org/library/urllib2.html y http://docs.python.org/library/httplib.html ) carece de información al respecto; el hilo de la palabra ni siquiera se menciona allí ...
ACTUALIZAR
Ok, no son seguros para subprocesos fuera de la caja. ¿Qué se requiere para que sean seguros para subprocesos o hay un escenario en el que pueden ser seguros para subprocesos? Lo pregunto porque parece que
- usando
OpenerDirector
separado en cada hilo - no compartir la conexión HTTP entre los hilos
Bastaría con usar de forma segura estas librerías en hilos. Se propuso un escenario de uso similar en la pregunta sobre seguridad de hilos de urllib2 y cookielib