Red de conocimiento informático - Problemas con los teléfonos móviles - Comenzando con Python Queue

Comenzando con Python Queue

La cola es un tipo de estructura de datos. Básicamente, todos los lenguajes de programación maduros tienen soporte integrado para la cola.

El módulo Queue en Python implementa un modelo multiproductor y multiconsumidor, lo cual resulta muy práctico cuando se requiere programación multiproceso. Además, la clase Queue en este módulo implementa la primitiva de bloqueo, por lo que no es necesario considerar problemas de seguridad de subprocesos múltiples.

Este módulo tiene tres tipos de cola integradas, a saber, cola de clase.Queue(maxsize=0), cola de clase.LifoQueue(maxsize=0) y cola de clase.PriorityQueue(maxsize=0). La única diferencia entre los tres es que el orden al sacarlos es inconsistente.

La cola es una cola FIFO y las tareas se eliminan en el orden en que se agregan.

LifoQueue es una cola LIFO, similar a una pila, y las tareas que se agregan más tarde se eliminan primero.

PriorityQueue es una cola prioritaria. Las tareas en la cola se clasifican según la prioridad y las tareas con mayor prioridad se eliminan primero.

Como puede ver, hay tres tipos diferentes de colas integradas mencionadas anteriormente, donde maxsize es un número entero que se utiliza para establecer el límite superior de la cantidad de tareas que se pueden colocar en la cola. Cuando se alcanza este tamaño, la operación de inserción se bloqueará hasta que se consuman las tareas en la cola. Si maxsize es menor o igual a cero, el tamaño de la cola es infinito.

Para agregar una tarea a la cola, simplemente llame a la función put() directamente

La firma completa de la función put() es la siguiente: Queue.put(item, block=True, timeout=None ), como puede ver, esta función tiene dos parámetros opcionales.

De forma predeterminada, cuando la cola está llena, esta función se bloqueará hasta que haya espacio en la cola para agregar tareas. Si el tiempo de espera es un número positivo, se bloqueará durante hasta segundos de tiempo de espera. Si no hay una posición libre dentro de este período, se generará una excepción completa.

Cuando el bloqueo es falso, el parámetro de tiempo de espera no será válido. Al mismo tiempo, si no hay una posición libre en la cola para agregar una tarea, se generará una excepción completa. De lo contrario, la tarea se colocará directamente en la cola y se devolverá sin bloquear.

Además, también puede agregar tareas a través de Queue.put_nowait(item), que es equivalente a Queue.put(item, False) y no se describirá nuevamente. Asimismo, esta operación genera una excepción Completa cuando la cola está llena.

Para obtener tareas de la cola, simplemente llame a la función get() directamente.

Al igual que la función put(), la función get() también tiene dos parámetros opcionales. La firma completa es la siguiente Queue.get(block=True, timeout=None).

De forma predeterminada, llamar a esta función cuando la cola está vacía se bloqueará hasta que haya una tarea disponible en la cola. Si el tiempo de espera es un número positivo, se bloqueará durante un máximo de segundos y, si no hay tareas disponibles dentro de este tiempo, se generará una excepción vacía.

Cuando el bloqueo es falso, el parámetro de tiempo de espera no será válido. Al mismo tiempo, si no hay ninguna tarea para obtener en la cola, se generará inmediatamente una excepción vacía. De lo contrario, se obtendrá una tarea directamente y se devolverá sin bloquear.

Además, también puede obtener tareas a través de Queue.get_nowait(), que es equivalente a Queue.get(False) y no se describirá en detalle. Asimismo, esta operación genera una excepción Vacía cuando la cola está vacía.

La función Queue.qsize() devuelve el tamaño de la cola. Tenga en cuenta que este tamaño no es exacto, qsize() > 0 no garantiza que get() posterior no se bloqueará, y qsize() lt maxsize no garantiza que put() no se bloqueará.

Devuelve Verdadero si la cola está vacía, Falso en caso contrario. Si vacía() devuelve True , no hay garantía de que las llamadas posteriores a put() no se bloqueen. De manera similar, si vacío() devuelve Falso, no hay garantía de que las llamadas posteriores a get() no se bloqueen.

Devuelve True si la cola está llena, False en caso contrario. Si full() devuelve True, no hay garantía de que las llamadas posteriores a get() no se bloqueen. De manera similar, si full() devuelve False, no hay garantía de que las llamadas posteriores a put() no se bloqueen.

queue.Queue() es una cola FIFO y el orden de salida de la cola es el mismo que el orden de puesta en cola.

queue.LifoQueue() es una cola LIFO. El orden de salida de la cola es completamente opuesto al orden de puesta en cola, similar a una pila.

El orden de las tareas en la cola de prioridad no tiene nada que ver con el orden en que se colocan. En cambio, se ordenan según el tamaño de las tareas y el valor más pequeño se saca primero. . ¿Cuáles son las reglas para comparar tamaños de tareas?

Tenga en cuenta que debido a que las reglas de comparación de listas se basan en el orden de los subíndices, los tipos de elementos en las posiciones de subíndice correspondientes de todas las listas en la cola deben ser consistentes antes de comparar el tamaño.

Por ejemplo, debido a que el tipo de elemento en la primera posición es diferente de ["1", "b"], no hay forma de comparar el tamaño, por lo que no se puede colocar en la cola de prioridad.

Sin embargo, para y [1, "b"], incluso si el tipo del segundo elemento es inconsistente, se puede colocar en la cola de prioridad, porque solo es necesario tener en cuenta el tamaño del primer elemento de posición. comparar Una vez que se obtiene el resultado, no es necesario comparar el tamaño del elemento de la segunda posición.

Pero para y 1 [2, "b"], no se puede colocar en la cola de prioridad porque el elemento en la segunda posición debe compararse para comparar el resultado. Sin embargo, el segundo tipo de elemento. de las posiciones son inconsistentes y no se pueden comparar en tamaño.

En resumen, es decir, hasta que se obtenga el resultado de la comparación, los tipos de elementos correspondientes a las posiciones de los subíndices deben ser consistentes.

A continuación personalizamos un tipo de animal y esperamos priorizarlo según la edad. Cuanto más joven es la edad, mayor es la prioridad.

Este capítulo presenta las colas y sus operaciones comunes. Debido a que la cola implementa la primitiva de bloqueo de forma predeterminada, no es necesario considerar problemas de seguridad de subprocesos múltiples en la programación de subprocesos múltiples, que es bastante amigable para los programadores.