Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo imprimir 123 líneas en Python?

¿Cómo imprimir 123 líneas en Python?

Abra tres subprocesos al mismo tiempo y solo pueden generar 1, 2 y 3 respectivamente. Deje que los tres subprocesos generen e impriman 123123123...

Este problema es simplemente una especie de semáforo. Dejamos que la luz roja se encienda primero, luego la luz amarilla se enciende después de un tiempo, la luz verde se enciende después de un tiempo, y así sucesivamente. En términos generales, para subprocesos múltiples, es fácil cambiar estos tres colores, pero si no se controla, su orden de ejecución será confusa, tal vez después de la luz roja o después de la luz roja, después de la luz verde o después de la luz verde. ligero (esto en realidad causará grandes desastres), por lo que para lograr la ejecución secuencial entre múltiples subprocesos, debe utilizar el concepto de bloqueo. Es decir, GIL, bloqueo de sincronización (bloqueo mutex) y bloqueo recursivo (utilizado para resolver un punto muerto, que puede causar un punto muerto cuando hay múltiples bloqueos mutex) en Python. En Python, no profundizamos en el concepto de bloqueos y utilizamos subprocesos directamente. Bloquee aquí para resolver los problemas anteriores.

Para lograr la ejecución secuencial de subprocesos múltiples, la clave radica en cómo controlar lock.acquire() y liberar lock.release(). Aquí podemos considerar el cambio de varios colores de semáforos como bloqueo y desbloqueo. Al principio la luz roja estaba encendida. Entonces, en el momento inicial, entre los tres candados de rojo, amarillo y verde, solo se libera el candado de luz roja, y se bloquean los candados de luz amarilla y verde, de modo que solo el hilo de luz roja puede ingresar para obtener recursos, lo que se muestra como una luz roja. Lo que hay que tener en cuenta aquí es que después de que entra el hilo de la luz roja, se debe bloquear para evitar que entren otros hilos (cuando la luz roja está encendida, los tres bloqueos están bloqueados, la luz roja indica que se acabó el tiempo); y la siguiente es la luz amarilla, que debe soltarse para el bloqueo de la luz, deje que entre el hilo de la luz amarilla y luego bloquee la cerradura después de entrar, cuando se muestre la luz amarilla, desbloquee la luz verde para que se muestra la luz verde, etc.

El código completo es el siguiente:

Importar hilo

Importar hora

Red_lock = hilo. Lock() #Bloqueo de luz roja

Yellow_lock=hilo. Lock() #Bloqueo de luz amarilla

Green_lock = hilo. Lock() #Bloqueo de luz verde

Count = 18 #Para evitar bucles continuos, asumimos que cada número se genera 6 veces, 3 × 6 = 18.

def red():

" ""Función de visualización de luz roja" "

Recuento global

mientras que cuenta gt= 0 :

Red_lock.acquire() #Bloquea el candado de luz roja.

Print(1, end = '-') #Indica que la luz roja es 1.

# print ('id: ', threading.get _ ident ()) #Ver ID del hilo

Yellow_lock.release() #Luego se encenderá la luz amarilla y el Se liberará el bloqueo de la luz amarilla.

Conteo-= 1

def yellow():

" ""Función de visualización de luz amarilla" ""

Conteo global

mientras cuenta gt= 0:

Yellow_lock.acquire() #Bloquea la luz amarilla.

Print(2, end = '-') #Indica que la luz amarilla es 2.

# print('id:', threading.get_ident())

Green_lock.release() # Luego se enciende la luz verde, desbloquea la luz verde.

Conteo-= 1

def green():

" ""Función de visualización de luz verde" ""

Conteo global

p>

mientras cuenta gt= 0:

Green_lock.acquire() #Bloquea la luz verde.

Print(3, end = '-') #Indica que la luz verde es 2.

# print('id:', threading.get_ident())

Red_lock.release() #La siguiente es la luz roja, y se libera el bloqueo de la luz roja.

count -= 1

if __name__ == '__main__ ':

thread_list = []

func_list =[rojo, amarillo , verde]

Para funciones en func_list: #Crea tres hilos.

th = hilo. Thread (target = func)

thread_list.append

#La luz roja se enciende primero, por lo que las luces amarilla y verde se bloquean para bloquear la ejecución de los subprocesos 2 y 3.

Yellow_lock.acquire() # 2 candados

Green_lock.acquire() # 3 candados

Para el de la lista de temas:

# print(time.time()) #Se utiliza para determinar el tiempo de inicio.

th.start()

Para th en la lista de hilos:

th.join()

Copiar después de iniciar sesión

p>

El resultado de la implementación es:

1-2-3-1-2-3-1-2-3-1-2-3-1-2- 3-1-2- 3-1-2-3-

Copiar después de iniciar sesión

El propósito de juzgar la hora de inicio anterior es ver si los dos comienzan al mismo tiempo. tiempo. Debido a que el bucle for es secuencial, los tres subprocesos no se iniciarán al mismo tiempo. Aunque a veces el tiempo de salida será el mismo, en realidad es diferente.