Cómo utilizar el bloqueo de subprocesos de Python (análisis de ejemplo)
En este artículo, echemos un vistazo a qué es el bloqueo de subprocesos de Python. Obtenga información sobre los bloqueos de subprocesos de Python y qué papel pueden desempeñar los bloqueos de subprocesos en la programación de Python.
Bloqueo de subprocesos (Mutex)
Se pueden iniciar varios subprocesos en un proceso y varios subprocesos comparten el espacio de memoria del proceso principal, lo que significa que cada subproceso puede acceder a los mismos datos. En este momento, ¿qué pasará si dos subprocesos quieren modificar los mismos datos al mismo tiempo?
Uso de bloqueos:
Crear bloqueos
mutex = threading.Lock()
Bloqueo
mutex .acquire([timeout])
Liberación
mutex.release()
tiempo de importación
importación de subprocesos
def addNum():
global num #Obtener esta variable global en cada hilo
print('--get num:',num)
time.sleep(1)
num -=1 #Realizar la operación -1 en esta variable pública
num = 100 #Establecer una variable compartida
thread_list = []
para i en el rango(100):
t = threading.Thread(target=addNum)
t.start()
thread_list.append(t)
for t in thread_list: #Espera a que se completen todos los hilos
t.join()
print(' final num:', num ) Normalmente, el resultado numérico debe ser 0, pero si lo ejecuta varias veces en Python 2.7, encontrará que el resultado numérico final impreso no siempre es 0. ¿Por qué los resultados son diferentes cada vez? Ja, es muy simple. Supongamos que tiene dos subprocesos A y B. En este momento, num debe disminuirse en 1. Dado que los dos subprocesos se ejecutan al mismo tiempo, es muy probable que los dos subprocesos eliminen num = 100 al mismo tiempo. Al mismo tiempo, esta variable inicial se entrega a la CPU para su cálculo. Cuando el subproceso A completa la operación, el resultado es 99, pero en este momento, el subproceso B completa la operación y el resultado también es 99. Después de los resultados de la CPU. Las operaciones de los dos subprocesos al mismo tiempo se asignan a la variable numérica y los resultados son 99. ¿Qué hacer? Es muy simple. Cuando cada hilo quiere modificar los datos públicos, para evitar que otros modifiquen los datos antes de que él haya terminado de modificarlos, puede agregar un bloqueo a los datos, de modo que cuando otros hilos quieran modificar los datos, Debe esperar a que complete la modificación y libere el bloqueo antes de poder acceder a estos datos nuevamente.
Nota: No ejecutar en 3.x. Por alguna razón, los resultados en 3.x siempre son correctos. Puede ser que el bloqueo se agregue automáticamente.