Una breve discusión sobre los bloqueos de subprocesos en Python
Las condiciones de carrera son un tema importante en la programación concurrente. Esta situación ocurre cuando un subproceso intenta modificar un recurso compartido mientras otro subproceso está modificando el recurso; esto da como resultado una salida confusa, razón por la cual los subprocesos deben sincronizarse.
El módulo de subprocesamiento de Python incluye Lock como herramienta de sincronización. El candado tiene dos estados:
El candado se puede bloquear utilizando el método adquirir(). Una vez que un hilo adquiere un bloqueo, todos los intentos posteriores de adquirir el bloqueo se bloquean hasta que se libera. El bloqueo se puede liberar utilizando el método release().
El siguiente código muestra un ejemplo simple de cómo usar un candado en Python:
Supongamos que hay $100 en una cuenta bancaria. Deposite $10 cada mes como ganancia y deduzca $10 para pagar facturas. Thread1 se utiliza para depositar ganancias, mientras que thread2 se utiliza para pagar facturas. En ciertos meses, las ganancias se depositan después de pagar las facturas. Sin embargo, esto no debería afectar el monto final de la cuenta.
Debido a las condiciones de la carrera, los resultados obtenidos por el siguiente código pueden ser incorrectos. Puede suceder que un subproceso no pueda escribir el valor actualizado en el depósito de la variable compartida antes del cambio de contexto, mientras que otro subproceso lee el valor no actualizado, lo que genera resultados impredecibles.
Al ejecutar el código anterior se generará
El código entre los métodos adquirir() y liberar() se ejecuta de forma atómica, por lo que un hilo no puede leer una versión no actualizada.
Al ejecutar el programa anterior se obtendrá: