Red de conocimiento informático - Problemas con los teléfonos móviles - Descripción general de subprocesos múltiples de Python

Descripción general de subprocesos múltiples de Python

En el proceso de procesamiento de datos real, debido a la memoria limitada del sistema, no podemos exportar todos los datos a la vez para su operación, por lo que debemos realizar operaciones secuenciales de exportación por lotes. Para acelerar la operación, utilizaremos subprocesos múltiples para el procesamiento de datos. La siguiente es la plantilla de procesamiento de datos por lotes de subprocesos múltiples que resumí:

Se divide principalmente en tres partes:

* ***El contenido de subprocesos múltiples resumido se divide en cuatro partes.

Primero, te presentamos el concepto de subprocesos:

En el programa de carreras de velocidad, sin subprocesos múltiples, no podemos jugar carreras de velocidad mientras escuchamos canciones, escuchamos canciones y jugar juegos no se puede jugar simultáneamente; con subprocesos múltiples, podemos jugar mientras escuchamos música de fondo. En este ejemplo, iniciar el programa del automóvil es un proceso, mientras que jugar y escuchar música son dos subprocesos.

Python proporciona el módulo de subprocesos para implementar subprocesos múltiples:

Debido a que el sistema necesita asignar recursos para crear nuevos subprocesos y reclamar recursos para terminar subprocesos, si puede reutilizar subprocesos, puede reducirlos. sobrecarga de creación/terminación de subprocesos, mejorando así el rendimiento. Además, usar la sintaxis de un grupo de subprocesos es más limpio que crear su propio subproceso nuevo para la ejecución de subprocesos.

Python nos proporciona ThreadPoolExecutor para implementar un grupo de subprocesos, que está protegido por subprocesos secundarios de forma predeterminada. Es adecuado para escenarios donde hay una gran cantidad de solicitudes repentinas o se requiere una gran cantidad de subprocesos para completar la tarea, pero el tiempo real de procesamiento de la tarea es corto.

Entre ellos, max_workers es el número de subprocesos en el grupo de subprocesos, y los métodos transversales más utilizados son mapear y enviar como_completado. Dependiendo del escenario empresarial, si necesitamos devolver la salida en el orden de recorrido, usaremos el método de mapa, y si queremos devolver quien complete primero, usaremos enviar as_complete.

Llamamos recursos críticos a los recursos que solo pueden ser utilizados por un subproceso en un período de tiempo, y el acceso a los recursos críticos debe ser mutuamente excluyente. Exclusión mutua, también conocida como restricciones indirectas. La exclusión mutua de subprocesos significa que cuando un subproceso accede a un recurso crítico, otro subproceso que desea acceder al recurso crítico debe esperar. Solo después de que el subproceso que actualmente accede al recurso crítico complete el acceso y libere el recurso, otros subprocesos podrán acceder al recurso crítico. La función del bloqueo es permitir la exclusión mutua de subprocesos.

Comparo la exclusión mutua de hilos con el proceso de subirse a la bañera en el inodoro. Debido a que solo hay un pozo en el inodoro, solo se permite subir a una persona. Cuando la primera persona quiera ir al baño, cerrará la puerta con llave. En este momento, si la segunda persona también quiere ir al baño, deberá esperar hasta que la primera haya terminado de usar el baño y. abre la puerta. Al mismo tiempo, la segunda persona tendrá que esperar afuera de la puerta. El proceso es el mismo que usar bloqueos en el código, y la trampa aquí es el recurso crítico. El módulo de subprocesamiento de Python introduce bloqueos. El módulo thread proporciona la clase Lock, que tiene los siguientes métodos para agregar y liberar bloqueos:

Notarás que este programa solo imprime el "primer bloqueo" y el programa no finaliza ni continúa ejecutándose. Esto se debe a que después de agregar el primer bloqueo en el mismo hilo, el bloqueo Lock emitirá una segunda solicitud de adquisición antes de liberarse, lo que resultará en una operación de liberación que no se puede realizar, por lo que el bloqueo nunca se libera, lo cual es un punto muerto. Si usamos RLock, podemos ejecutar normalmente sin interbloqueos.

Defina el bloqueo en el hilo principal, luego bloquéelo y luego cree un subproceso t para ejecutar la función principal para liberar el bloqueo. El resultado es una salida normal, lo que significa que el bloqueo está activado. el hilo principal puede ser desbloqueado por el hilo secundario.

Si cambia el bloqueo anterior a RLock, obtendrá un error. Al diseñar realmente el programa, encapsularemos cada función en una función separada, y cada función puede tener una sección crítica, por lo que debemos usar RLock.

En resumen, Lock no se puede anidar, pero RLock se puede anidar; Lock puede ser operado por bloqueos en otros subprocesos, y RLock solo puede ser operado por este subproceso.