La combinación de cola de Python y subprocesos múltiples (modo productor consumidor)
En el mundo de los hilos, los productores son hilos que producen datos y los consumidores son hilos que consumen datos. En el desarrollo de subprocesos múltiples, si el productor es rápido y el consumidor es lento, entonces el productor es el subproceso que produce datos y el consumidor es el subproceso que consume datos. Entonces, ¿el procesamiento del consumidor es lento? El productor debe esperar a que el consumidor complete el procesamiento antes de continuar produciendo datos. El productor debe esperar a que el consumidor complete el procesamiento antes de continuar produciendo datos. De manera similar, si el consumidor procesa más rápido que el productor, el productor debe esperar a que el consumidor termine de procesar antes de continuar produciendo datos. Si el consumidor procesa más rápido que el productor, el consumidor debe esperar a que complete el procesamiento antes de continuar con la producción. Para solucionar este problema, los productores han introducido un nuevo método. Se introdujo el modelo productor-consumidor. Modelo productor-consumidor.
El modelo productor-consumidor resuelve el fuerte problema de acoplamiento entre productores y consumidores a través de un contenedor. El modelo productor-consumidor resuelve el problema del fuerte acoplamiento entre productores y consumidores. Los productores y consumidores no se comunican directamente ni están conectados a través de colas de bloqueo. Los productores y consumidores no se comunican directamente, sino que están conectados a través de colas de bloqueo. Los productores y consumidores no se comunican directamente, sino a través de colas de bloqueo. Los productores no se comunican directamente entre sí. Después de generar datos, no esperan a que el consumidor los procese, sino que los arrojan directamente a la cola de bloqueo. Una vez que el productor genera datos, no espera a que el consumidor los procese, sino que los arroja directamente a la cola de bloqueo y el consumidor no solicita datos al productor. Los consumidores no piden datos a los productores. El consumidor no solicita datos al productor, sino que los obtiene directamente de la cola de bloqueo. Las colas de bloqueo son equivalentes a los buffers, lo que equilibra la necesidad de buffers. La cola de bloqueo es equivalente a un búfer y puede equilibrar las capacidades de procesamiento de productores y consumidores. Esto se debe a que los consumidores son los únicos capaces de procesar datos y los productores son los únicos capaces de procesar datos.
Por ejemplo, para un rastreador multiproceso que rastrea varias páginas web al mismo tiempo, es posible que no pueda garantizar que estén funcionando en diferentes sitios web en algunos momentos, pero en otros momentos sí lo hacen. Es probable que trabaje en diferentes sitios web. Trabajar en el mismo sitio web genera desperdicio. Para resolver este problema, puede colocar las URL de diferentes páginas web en una cola y luego usar varios subprocesos para leer las URL en la cola para su análisis. La cola solo permite que se libere una a la vez, una menos. el otro. Las URL de diferentes páginas de un mismo sitio web suelen tener ciertas reglas, como sumar 1 al número de un determinado campo. En este caso, se puede utilizar esta regla. El "programa productor" se encarga de hacer la URL completa. las reglas y luego insertarlas en la cola (espere si la cola está llena) "obtiene las URL del final de la cola y las analiza una por una (espere si la cola está vacía), asegurándose de que cada subproceso puede obtener una URL diferente incluso si es de subprocesos múltiples y asegúrese de que los productores y consumidores no interfieran entre sí durante este proceso.
El siguiente ejemplo ilustra cómo combinar colas con subprocesos múltiples para Forme el llamado modelo "productor-consumidor" y resuelva múltiples problemas. ¿Cómo salen los subprocesos? (tenga en cuenta que en el siguiente ejemplo, el modelo "un productor, múltiples consumidores" se puede implementar aún más sobre la base del modelo multiproductor. -modelo de consumidor):
Arriba El flujo del programa es el siguiente:
Nota:
(1) El intervalo de tiempo para que el productor inserte en la cola En el programa anterior, el intervalo de tiempo para que el productor inserte en la cola es 0,1 s, mientras que el consumidor El tiempo para sacar la cola es 2 s, lo que obviamente no es tan rápido como el productor La cola está vacía. al principio, pero después de un tiempo la cola está llena, y el resultado también muestra esto. Si se invierten los dos tiempos, el resultado es exactamente lo contrario. Nunca estará lleno, incluso con 1 valor, porque se consumirá como. tan pronto como entre en la cola.
(2) El programa consumidor se ejecuta continuamente impulsado por "mientras". En el ejemplo anterior, se informa al consumidor que el productor ha terminado y el consumidor puede finalizar agregando Ninguno a la cola. Pero hay más de un consumidor, ¿cuál consumidor obtiene Ninguno? Para resolver este problema, en el ejemplo anterior, el consumidor debe determinar si el hilo eliminado actualmente es Ninguno. Si es así, primero inserte un Ninguno en la cola y luego interrumpa el hilo del consumidor actual. Los subprocesos del consumidor salen, pero no queda ninguno en la cola que no haya sido eliminado. El resultado final es que todos los subprocesos del consumidor salen, pero ninguno que queda en la cola no se elimina. Por lo tanto, debe agregar un bucle for al final del programa para eliminar los elementos de la cola uno por uno; de lo contrario, el último q.join() se bloqueará para siempre y el programa no podrá continuar con la ejecución.
(3) Cada q.get() en el programa va seguido de un q.task_done(), cuya función es enviar un mensaje a q.join() al eliminar elementos de la cola, en caso contrario q .join() se bloqueará para siempre hasta que se hayan eliminado todos los elementos de la cola.
Estructura general del modelo productor-consumidor multiproceso