Me gustaría saber si los contenedores integrados de Python (list, vector, set ...) son seguros para subprocesos? ¿O necesito implementar un entorno de bloqueo/desbloqueo para mi variable compartida?¿Los contenedores integrados de Python son seguros para subprocesos?
Respuesta
Debe implementar su propio bloqueo para todas las variables compartidas que se modificarán en Python. No tiene que preocuparse por leer las variables que no se modificarán (es decir, las lecturas simultáneas son correctas), por lo que los tipos inmutables (frozenset
, tuple
, str
) son probablemente seguros, pero no haría daño. Para las cosas que va a cambiar: list
, set
, dict
, y la mayoría de los demás objetos, debe tener su propio mecanismo de bloqueo (mientras que las operaciones in situ están bien en la mayoría de estos, los hilos pueden provocar errores súper desagradables - también podría implementar el bloqueo, es bastante fácil).
Por cierto, no sé si usted sabe esto, pero es muy fácil de bloqueo en Python - Crear un objeto threading.lock, y luego se puede adquirir/liberar de esta manera:
import threading
list1Lock = threading.Lock()
with list1Lock:
# change or read from the list here
# continue doing other stuff (the lock is released when you leave the with block)
En Python 2.5, do from __future__ import with_statement
; Python 2.4 y antes no la tienen, así que querrá poner la adquisición()/release() llama en try:...finally:
bloques:
import threading
list1Lock = threading.Lock()
try:
list1Lock.acquire()
# change or read from the list here
finally:
list1Lock.release()
# continue doing other stuff (the lock is released when you leave the with block)
Some very good information about thread synchronization in Python.
Son seguros para subprocesos siempre que no deshabilite el GIL en el código C para el subproceso.
Este es un detalle de implementación de CPython que no debe retransmitirse. Posiblemente va a tener posibilidades en el futuro y otras implementaciones no lo tienen. –
Georg: este aspecto de la pitón me aterroriza. No importa todos los errores que saldrán de los programas java cuando 8 núcleos se vuelvan comunes en el escritorio: ¿qué sucede cuando GIL se elimina y las aplicaciones de python multiproceso se ejecutan repentinamente en 8 cajas de núcleos? – Ben
No debería aterrorizar a nadie si no pretende que su código es seguro para subprocesos cuando claramente no lo es. :) – Kylotan
Sí, pero todavía hay que tener cuidado, por supuesto
Por ejemplo:
Si dos hilos están compitiendo para pop()
de una lista con sólo un elemento, un hilo conseguir el artículo con éxito y el otra recibirá IndexError
Código como este no es seguro para subprocesos
if L:
item=L.pop() # L might be empty by the time this line gets executed
debe wr ite it like this
try:
item=L.pop()
except IndexError:
# No items left
Quiero que pop() sea seguro para la tarea, pero no puedo encontrar este hecho en ningún lugar de la documentación. ¿Alguien puede ayudarme a obtener este reclamo antes de tomarlo como un evangelio? –
¿De verdad? list.pop() no es seguro para subprocesos? Vi otro artículo que decía lo contrario. http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm –
@ Zhongjun'Mark'Jin dijo que ES seguro para hilos ... pero eso no significa no tienes que considerar los otros hilos. Si un hilo aparece el último elemento y luego otro hilo intenta abrir también, obtendrá IndexError, como él dice. – fantabolous
- 1. comparación personalizada para contenedores integrados
- 2. ¿Son seguros los subprocesos urllib2 y httplib?
- 3. ¿Los delegados de C# son seguros para subprocesos?
- 4. ¿Los métodos de IEnumerable Linq son seguros para subprocesos?
- 5. ¿Por qué los servlets no son seguros para subprocesos?
- 6. ¿Por qué los objetos inmutables son seguros para subprocesos?
- 7. ¿La primavera TransactionTemplate y SimpleJdbcTemplate son seguros para subprocesos?
- 8. ¿Los métodos estáticos en las clases de código subyacente de ASP.NET no son seguros para subprocesos?
- 9. ¿Por qué los EJB son seguros y los servlets no?
- 10. ¿Los tipos de datos primitivos son seguros para subprocesos en Java
- 11. ¿Los flujos de salida estándar en C++ son seguros para subprocesos (cout, cerr, clog)?
- 12. ¿Estos hilos son seguros?
- 13. ¿Contenedores clave, lo suficientemente seguros como para almacenar claves privadas?
- 14. C#: eventos seguros contra subprocesos
- 15. ¿Cuán seguros son los CDN para entregar jQuery?
- 16. ¿Es seguro un hilo de tabla Guava cuando sus mapas de respaldo son seguros para subprocesos?
- 17. ¿Los contenedores estándares C++ 11 son "definitivos"?
- 18. ¿Cuáles son los contenedores en Java
- 19. ¿Los comentarios son 100% seguros en todos los entornos principales?
- 20. ¿Alguien que usa Python para proyectos integrados?
- 21. ¿Cómo funcionan los subprocesos en Python, y cuáles son los peligros específicos de Python-threading?
- 22. ¿Los pasos de inserción y eliminación de LinkedBlockingQueue son seguros?
- 23. ¿Los canales de Haskell `Control.Concurrent.Chan` son seguros para múltiples lectores/productores?
- 24. ¿Los miembros privados son realmente más "seguros" en Java?
- 25. ¿Cuáles son las garantías de complejidad de los contenedores estándar?
- 26. ¿Qué tan seguros son los recursos en .NET?
- 27. ¿Los parámetros de las referencias .NET son seguros para la ejecución de subprocesos o son vulnerables al acceso multiproceso no seguro?
- 28. Los métodos UIStringDrawing no parecen ser seguros para subprocesos en iOS 6
- 29. ¿Están seguros los clientes de JAX-WS?
- 30. ¿Cuáles son los requisitos previos para aprender la programación de sistemas integrados?
Creo que, para alguien que no ha utilizado bloqueos de enhebrado antes, debe tenerse en cuenta que el bloqueo (en su ejemplo, 'list1Lock') debe * compartirse * entre los hilos, para que funcione correctamente. Dos bloqueos independientes, uno para cada hilo, no bloquearían nada, solo agregarían una sobrecarga tonta. – tzot
¿No debería ser este: con list1Lock: # Hacer cosas –
@ slack3r Good call! –