[Python] Resumen de procesos múltiples

cada blog, cada lema: Ilumina el mañana con el hoy.

0. Prefacio

Esta sección realiza experimentos y resume el multiproceso en Python.
Sugerencia: primero mire el concepto de multiproceso, esta sección no repetirá el concepto, haga clic en mí

1. Texto

1.1 Decorador

Decorador, utilizado para ver el tiempo de ejecución de la función, haga clic en mí

import threading
import time
import functools
from multiprocessing import Process

c = 0


def count_time(func):
    """装饰器:计算程序运行时间"""

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        t1 = time.time()
        res = func(*args, **kwargs)
        t2 = time.time()

        # 计算时间
        time_consumed = t2 - t1
        print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed))
        return res

    return wrapper

1.2 Parte de prueba multiproceso

1.2.1 La función probada es dos funciones

La función probada es la siguiente:

@count_time
def mop_floor(arg):
    """拖地操作,"""
    global c
    print('开始拖地……')
    for i in range(3):
        time.sleep(1)
        c += 5
        c -= 5
        print('{} is running……c={} !!'.format(arg, c))
    print('---------地拖完了!-----------')


@count_time
def heat_water(arg):
    """烧水操作"""
    global c
    print('我要烧水了……')
    for i in range(4):
        time.sleep(1)
        print('{} is running……c={} !!'.format(arg, c))
    print('------------水烧开了!-------------')

1>. Proceso único

Función de proceso único:

@count_time
def single_processing():
    """单进程"""
    # 对两个函数进行测试
    mop_floor('1')
    heat_water('2')
    print('-' * 100)

Función principal:

def main():
    # 单进程
    single_processing()

if __name__ == '__main__':
    main()

Resultados de ejecución de un solo proceso:
Inserte la descripción de la imagen aquí

2>. Multiproceso

Función multiproceso

@count_time
def my_processing():
    p1 = Process(target=mop_floor, args=('1',))
    p2 = Process(target=heat_water, args=('2',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    # -----------------------------------------
    # process_array = {}
    # n = 1
    # for tid in range(n):
    #     t = Process(target=single_func_tested, args=('1',))
    #     t.start()
    #     process_array[tid] = t
    # for i in range(n):
    #     process_array[i].join()

    print('-' * 100)

Función principal

def main():

    # 多进程
    my_processing()


if __name__ == '__main__':
    main()

Como resultado, se puede ver que el tiempo total se reduce
Inserte la descripción de la imagen aquí

1.2.2 La función bajo prueba es una función computacional

Función bajo prueba

@count_time
def single_func_tested(arg):
    """对一个函数进行测试"""
    sum = 0
    for i in range(10000000):  # 100000
        sum += i

    print('{} over'.format(arg))

1>. Proceso único

Función de proceso único

@count_time
def single_processing():
    """单进程"""

    # 对一个函数进行测试
    single_func_tested('1')
    print('-' * 100)

Función principal:

def main():
    # 单进程
    single_processing()

    # 多进程
    # my_processing()


if __name__ == '__main__':
    main()

Resultados del cálculo de un solo proceso:
Inserte la descripción de la imagen aquí

2>. Multiproceso

Función multiproceso

@count_time
def my_processing():

    process_array = {
    
    }
    n = 1
    for tid in range(n):
        t = Process(target=single_func_tested, args=('1',))
        t.start()
        process_array[tid] = t
    for i in range(n):
        process_array[i].join()

    print('-' * 100)

Función principal:

def main():


    # 多进程
    my_processing()


if __name__ == '__main__':
    main()

Cuando n = 1,
Inserte la descripción de la imagen aquí
cuando n = 2,
Inserte la descripción de la imagen aquí
cuando n = 3,
Inserte la descripción de la imagen aquí
cuando n = 4,
Inserte la descripción de la imagen aquí
cuando n = 5,
Inserte la descripción de la imagen aquí
resumen:

  1. Cuando n <= 4, el tiempo total de ejecución del programa no cambia. Esto se debe a que la máquina experimental tiene 4 núcleos, por lo que cuando hay menos de 4 procesos, los núcleos son suficientes. Cuando n> 4, el tiempo de ejecución del programa aumenta. El número de procesos abiertos supera el número de núcleos.
  2. Las condiciones para abrir el proceso son múltiples CPU o una CPU tiene múltiples núcleos
  3. El proceso múltiple para un solo programa no acortará el tiempo de ejecución del programa, solo ejecute un solo programa unas cuantas veces más

1.2.3 La función que se está probando es una función de espera

Función bajo prueba

@count_time
def mop_floor(arg):
    """拖地操作,"""
    global c
    print('开始拖地……')
    for i in range(3):
        time.sleep(1)
        c += 5
        c -= 5
        print('{} is running……c={} !!'.format(arg, c))
    print('---------地拖完了!-----------')

1>. Proceso único

Función de proceso único

@count_time
def single_processing():
    """单进程"""
    # 对两个函数进行测试
    mop_floor('1')
    # heat_water('2')

    # 对一个函数进行测试
    # single_func_tested('1')
    print('-' * 100)

Función principal

def main():
    # 单进程
    single_processing()



if __name__ == '__main__':
    main()

resultado:
Inserte la descripción de la imagen aquí

2>. Multiproceso

Función multiproceso:

@count_time
def my_processing():

    n = 1
    for tid in range(n):
        t = Process(target=mop_floor, args=('1',))
        t.start()
        process_array[tid] = t
    for i in range(n):
        process_array[i].join()

    print('-' * 100)

Función principal:

def main():


    # 多进程
    my_processing()


if __name__ == '__main__':
    main()

Cuando n = 1,
Inserte la descripción de la imagen aquí
cuando n = 2,
Inserte la descripción de la imagen aquí
cuando n = 3,
Inserte la descripción de la imagen aquí
cuando n = 4,
Inserte la descripción de la imagen aquí
cuando n = 5,
Inserte la descripción de la imagen aquí
cuando n = 8,
Inserte la descripción de la imagen aquí
resumen:

  1. Cuando la teoría del proceso excede la teoría central, el tiempo total de ejecución aumenta ligeramente y el aumento no es tan obvio como la función computacional .
  2. El proceso múltiple para un solo programa no acortará el tiempo de ejecución del programa, solo ejecute un solo programa unas cuantas veces más

lo anterior.


para resumir:

  1. Las condiciones para abrir múltiples procesos son múltiples CPU o 1 CPU de múltiples núcleos
  2. Abra múltiples procesos para un solo programa, sin efecto

1.3 Código fuente

https://gist.github.com/onceone/f5489dcc1499c81ee0161f0ea3bb442b

referencias

[1] https://blog.csdn.net/weixin_39190382/article/details/107107980
[2] http://www.uml.org.cn/python/201901221.asp
[3] https: //www.jianshu .com / p / 644dbb6d4cc8
[4] https://blog.csdn.net/m0_37324740/article/details/85765167
[5] https://www.cnblogs.com/-qing-/p/11291581.html
[6 ] https://blog.csdn.net/lzy98/article/details/88819425
[7] https://www.cnblogs.com/yssjun/p/11302500.html
[8] https://www.jb51.net /article/167165.htm
[9] https://blog.csdn.net/weixin_44850984/article/details/89165731
[10] https://www.cnblogs.com/justbreaking/p/7218909.html?utm_source=itdadao&utm_medium = referencia

Supongo que te gusta

Origin blog.csdn.net/weixin_39190382/article/details/107207900
Recomendado
Clasificación