2011-08-16 16 views
12

Por ejemplo, si creo un iterador usando chain, ¿puedo invocarlo en múltiples hilos? Tenga en cuenta que la seguridad de hilos que se basa en el GIL es aceptable, pero no es preferible.¿Es itertools seguro para subprocesos?

(Tenga en cuenta que esto es un poco diferente de this question, que trata de generadores, no iteradores escritos en C).

Respuesta

11

En primer lugar, nada en el official documentation on itertools dice que son seguros para subprocesos. Parece que por especificación Python no garantiza nada al respecto. Esto podría ser diferente en implementaciones como Jython o PyPy, pero esto significa que su código probablemente no sea portátil.

En segundo lugar, la mayoría de itertools (con excepción de los simples, como count) toman como referencia otros iteradores. Necesitarás que estos iteradores también se comporten correctamente de una manera segura para subprocesos.

En tercer lugar, algunos iteradores pueden no tener sentido cuando se utilizan simultáneamente por diferentes subprocesos. Por ejemplo, izip trabajando en múltiples hilos podría entrar en condición de carrera tomando elementos de múltiples fuentes, especialmente como se define por código python equivalente (lo que sucederá cuando un hilo logre tomar valor de solo un iterador de entrada, luego segundo hilo de dos de ellos ?).

También tenga en cuenta que la documentación no menciona que itertools se implementan en C. Sabemos (como un detalle de implementación) que CPython's itertools están realmente escritos en C, pero en otras implementaciones pueden implementarse felizmente como generadores, y usted puede volver al question you cited.

Así que, no, no puede suponer que son seguros para subprocesos a menos que conozca los detalles de implementación de su plataforma de python de destino.

Cuestiones relacionadas