Programación concurrente de Python learningOne

Historial del sistema operativo

Simplemente consulte el blog: https://www.cnblogs.com/Dominic-Ji/articles/10929381.html

Tecnología multicanal

El núcleo único logra un efecto concurrente

Conocimiento requerido

  • Concurrencia

    Parece que correr simultáneamente puede llamarse concurrente

  • Paralelo

    Real ejecución simultánea

PD:

  • Paralelo debe considerarse concurrente

  • Las computadoras de un solo núcleo ciertamente no pueden lograr paralelismo, ¡pero pueden lograr concurrencia! ! !

Suplemento: asumimos directamente que un solo núcleo es un núcleo, y solo una persona trabaja, no tenga en cuenta la cantidad de núcleos en la CPU

Ilustración técnica multicanal

Ahorre el tiempo total dedicado a ejecutar múltiples programas

 

Conocimiento clave de tecnología multicanal

Multiplexación espacial y multiplexación temporal

  • Multiplexación espacial

    Múltiples programas comparten un conjunto de hardware de computadora

  • Multiplexación en el tiempo

    Ejemplo: lavar ropa durante 30 años, cocinar durante 50 años, agua hirviendo durante 30 años

    El canal único necesita 110 segundos, los canales múltiples solo necesitan el cambio largo de tarea para  ahorrar tiempo

    Ejemplo: jugar un juego mientras se come y se guarda el estado 

Cambiar + guardar estado

La conmutación (CPU) se divide en dos casos 
    1. Cuando un programa encuentra una operación de E / S, el sistema operativo privará al programa de la autoridad de ejecución de la CPU 
        Rol: mejora la utilización de la CPU y no afecta la eficiencia de ejecución del programa 
     
    2. Cuando Cuando un programa ocupa la CPU durante mucho tiempo, la atracción de la operación también privará al programa de la autoridad de ejecución de la CPU. 
        Inconvenientes: reduzca la eficiencia de ejecución del programa (tiempo original + tiempo de conmutación)

 

Teoría del proceso

Conocimiento requerido

La diferencia entre programa y proceso

Un programa es un montón de código que se encuentra en el disco duro. Un 
proceso "inactivo" indica que el programa se está ejecutando y que está "en vivo".

Programación de procesos

  • Algoritmo de programación por orden de llegada

El algoritmo de programación por orden de llegada (FCFS) es uno de los algoritmos de programación más simples, que se puede usar tanto para la programación de trabajos como para la programación de procesos. El algoritmo FCFS es más propicio para trabajos largos (procesos) que para trabajos cortos (procesos). Se puede ver que este algoritmo es adecuado para trabajos ocupados de CPU, pero no es propicio para trabajos ocupados de E / S (procesos).
  • Algoritmo de programación de prioridad de trabajo corto
El algoritmo de programación de prioridad de trabajo corto (proceso) (SJ / PF) se refiere a un algoritmo que prioriza trabajos cortos o procesos cortos. Este algoritmo se puede usar tanto para la programación de trabajos como para la programación de procesos. Pero no es bueno para trabajos largos; no hay garantía de que los trabajos urgentes (procesos) se procesen de manera oportuna; solo se estima la duración del trabajo.
  • Método de rotación de intervalo de tiempo + cola de comentarios de varios niveles

 

Diagrama de tres estados del proceso en ejecución

 

 

Dos pares de conceptos importantes.

  • Síncrono y asíncrono

"" "Describe la forma en que se envía la tarea". " 
Sincronización: después de enviar la tarea, espera el resultado de la tarea in situ. No se hace nada durante el proceso de espera (seco, etc.) 
    La sensación a nivel del programa es que está atascado 
asíncrono: después de la presentación del trabajo, hay lugar para esperar tareas regresan directamente los resultados para hacer otras cosas 
    cómo las tareas consiguen los resultados de mi presentación? 
    El resultado devuelto de la tarea será procesado automáticamente por un mecanismo de devolución de llamada asíncrono.

  

  • Bloqueo sin bloqueo
"" "Ejecución en marcha descripción del" "" 
bloqueo: bloqueo de estado 
de no-bloqueo: estado de listo, estado de funcionamiento 
al estado ideal: debemos dejar que nuestra escritura del código siempre en el estado de listo se enciende entre el estado y funcionamiento

Combinación de los conceptos anteriores: la combinación más eficiente es el bloqueo asíncrono sin bloqueo

 

Dos formas de iniciar el proceso.

de multiprocesamiento Importación Proceso de
 Importación Tiempo 
DEF tarea (nombre):
     Imprimir ( ' % S Correr es ' % nombre) 
    el time.sleep ( 3. )
     Imprimir ( ' % S Over es ' % nombre) 
SI  el __name__ == ' __main__ ' :
     # 1 crear un objeto 
    el proceso p = (target = de tareas, args = ( ' Jason ' ,))
     # tipo de contenedor, incluso si hay sólo un elemento de sugerencia de utilizar una coma
    # 2 abierta proceso 
    p.start ()   # indicar al sistema operativo para ayudarle a crear un proceso para asíncrono 
    de impresión ( ' principal ' ) 
    
    
# heredó segundo camino a la clase 
de multiprocesamiento Importación Proceso de
 Importación Tiempo 
clase MyProcess (Proceso):
     DEF RUN ( Ser):
         Imprimir ( ' Hola BF chica ' ) 
        del time.sleep ( . 1 )
         Imprimir ( ' ¡Fuera! ' ) 
SI  el __name__ == '__main__ ' : 
    p = MyProcess () 
    p.start () 
    print ( ' ' )

 

Resumen

Crear un proceso es solicitar un espacio de memoria en la memoria y arrojar el código que debe ejecutarse. 
Un proceso corresponde a un espacio de memoria separado 
en la memoria. Múltiples procesos corresponden a múltiples espacios de memoria independientes en la memoria 
. Datos entre procesos y procesos predeterminados En este caso, es imposible interactuar directamente. Si desea interactuar, puede usar herramientas y módulos de terceros.

 

método de unión

Unirse es dejar que el proceso principal espere a que el código del subproceso termine de ejecutarse antes de continuar. No afecta la ejecución de otros procesos secundarios.

de multiprocesamiento importación Proceso de
 importación tiempo 
def tarea (nombre, n):
     print ( ' % s se está ejecutando ' % nombre) 
    time.sleep (n) 
    de impresión ( ' % s ya ha pasado ' % nombre) 
si  __name__ == ' __main__ ' :
     # p1 = Proceso (target = task, args = ('jason', 1)) 
    # p2 = Process (target = task, args = ('egon', 2)) 
    # p3 = Process (target = task , args = ('tanque', 3)) 
    #start_time = time.time () 
    # p1.start () 
    # p2.start () 
    # p3.start () # Simplemente dígale al sistema operativo que cree un proceso 
    # # time.sleep (50000000000000000000) 
    # # p.join () # El proceso principal espera a que el proceso hijo p termine de ejecutarse antes de continuar. 
    # P1.join () 
    # p2.join () 
    # p3.join () 
    start_time = time.time () 
    p_list = []
     para i en el rango (1, 4 ): 
        p = Proceso (target = tarea, args = ( ' proceso hijo% s ' % i, i)) 
        p.start () 
        p_list.append (p) 
    para pen p_list: 
        p.join () 
    print ( ' ' , time.time () - start_time)

 

Aislamiento de datos entre procesos.

de multiprocesamiento importación Proceso de 
dinero = 100 def de tareas ():
     mundial dinero   # 局部修改全局 
    dinero = 666 print ( ' ' , dinero) si __name__ == ' __main__ ' : 
    p = Proceso (target = tarea ) 
    p.start () 
    p.join () print (dinero)

    
 
    

 

Supongo que te gusta

Origin www.cnblogs.com/imark7/p/12757987.html
Recomendado
Clasificación