python thread-safety urllib2 httplib

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ámetro url .

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