Python: la diferencia entre unión y evento en subprocesos múltiples, multiproceso y sin uso de unión y evento

I. Introducción

En la programación multiproceso y multiproceso de Python, join()ambas Eventson herramientas que se utilizan para controlar la relación de sincronización entre subprocesos o procesos, sus funciones son similares, pero aún existen algunas diferencias.

2. Concepto

1. unirse()

join()Un método es un método de un subproceso o instancia de proceso que bloquea el subproceso o proceso de llamada actual hasta que el subproceso o proceso completa la ejecución antes de continuar ejecutando el código posterior. join()Los métodos se utilizan a menudo para esperar a que se complete otro hilo o proceso. En el proceso principal, puede join()esperar a que se completen todos los procesos secundarios antes de continuar ejecutando el código del proceso principal.

2. Evento

EventEs un mecanismo de sincronización de subprocesos o procesos, utilizado principalmente para la comunicación entre subprocesos. A Eventrepresenta una bandera interna, que se puede configurar o borrar. Puede utilizar set()el método para configurar el indicador de evento y wait()el método para esperar a que se establezca el indicador. Alternativamente, clear()la bandera se puede borrar usando el método.

3. Diferencia

  • join()Los métodos de instancia que pertenecen a un subproceso o proceso solo se pueden usar en el subproceso o proceso actual Eventy se pueden compartir entre subprocesos o procesos.
  • join()La función es esperar a que el subproceso o proceso complete la ejecución para continuar ejecutando el código posterior; Eventla función es sincronizar y comunicarse entre subprocesos para lograr la espera local.

En general, join () es adecuado para controlar el orden de ejecución entre subprocesos o procesos, mientras que Event es adecuado para realizar la sincronización y comunicación entre subprocesos y solo espera parcialmente.

4. Código de muestra

A continuación se toman subprocesos como ejemplo y la implementación de procesos es similar.

1. Utilice unirse()

Espere a que un hilo termine de ejecutarse antes de ejecutar el siguiente paso

# -*- coding:utf-8 -*-
import time
import threading


def run(n, event):
    for i in range(1000):
        print(i, end=' ')
    # event.set()
    while n > 0:
        print('Threading:', n)
        n -= 1
        time.sleep(1)


event = threading.Event()

if __name__ == '__main__':
    print('start threading.')
    t = threading.Thread(target=run, args=(5, event))
    t.start()
    t.join()
    # event.wait()
    print('end threading...')

Resultados de la ejecución: se puede ver que el programa ha ejecutado todos los códigos en secuencia.
Insertar descripción de la imagen aquí

2. Utilice eventos

Espere a que se ejecute una parte del código en el hilo antes de ejecutar el siguiente código

# -*- coding:utf-8 -*-
import time
import threading


def run(n, event):
    for i in range(1000):
        print(i, end=' ')
    event.set()
    while n > 0:
        print('Threading:', n)
        n -= 1
        time.sleep(1)


event = threading.Event()

if __name__ == '__main__':
    print('start threading.')
    t = threading.Thread(target=run, args=(5, event))
    t.start()
    # t.join()
    event.wait()
    print('end threading.')

Efecto de ejecución: se puede ver que end threadingel código se ejecuta después de esperar a que termine de ejecutarse el código del bucle for. Explique que el evento es sólo una parte de la espera.
Insertar descripción de la imagen aquí

3. No uses el evento y únete

código

# -*- coding:utf-8 -*-
import time
import threading


def run(n, event):
    for i in range(1000):
        print(i, end=' ')
    # event.set()
    while n > 0:
        print('Threading:', n)
        n -= 1
        time.sleep(1)


event = threading.Event()

if __name__ == '__main__':
    print('start threading.')
    t = threading.Thread(target=run, args=(5, event))
    t.start()

    print('end threading.')

Efecto de ejecución: se puede ver que end threadingse ejecuta antes del bucle for y no espera a que termine de ejecutarse el código del bucle for.
Insertar descripción de la imagen aquí

Se adjuntan varios métodos para verificar la cantidad de subprocesos de proceso en Windows

método uno

# 获取 WMI 对象
wmi = win32com.client.GetObject("winmgmts:")

# 查询进程信息
process_query = "SELECT * FROM Win32_Process"
process_result = wmi.ExecQuery(process_query)
process_count = len(process_result)

# 查询线程信息
thread_query = "SELECT * FROM Win32_Thread"
thread_result = wmi.ExecQuery(thread_query)
thread_count = len(thread_result)

print("系统进程数量:", process_count)
print("系统线程数量:", thread_count)

Método dos


import psutil

# 获取进程数量
process_count = len(psutil.pids())
print("进程数量:", process_count)

# 获取线程数量
thread_count = 0
for proc in psutil.process_iter(['pid', 'name']):
   try:
       pinfo = proc.as_dict(attrs=['pid', 'name', 'num_threads'])
   except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
       pass
   else:
       thread_count += pinfo['num_threads']
print("线程数量:", thread_count)

Método tres

import multiprocessing
import threading

print(f"Process {
      
      multiprocessing.current_process().pid}: {
      
      threading.active_count()} threads")
print(f"Process {
      
      threading.current_thread()}: {
      
      threading.active_count()} threads")
print(f"Total threads: {
      
      threading.active_count()}")
print(f"Total processes: {
      
      len(multiprocessing.active_children())}")

V. Resumen

  • Cuando el subproceso principal o el proceso principal se está ejecutando, debe esperar a que el subproceso o subproceso complete una determinada tarea antes de continuar realizando operaciones posteriores. Si no se utiliza el método join(), el subproceso principal o el proceso principal pueden cerrarse antes de que el subproceso o subproceso complete la tarea, lo que provocará excepciones en el programa o resultados incorrectos.
  • Tanto join() como Event son herramientas de sincronización muy importantes en la programación multiproceso y multiproceso, que pueden hacer que el programa sea más confiable y eficiente. Cuando el programa necesita esperar a que se completen otros subprocesos o procesos antes de continuar con la ejecución, puede usar el método join(); cuando el programa necesita coordinarse y comunicarse con múltiples subprocesos o procesos, puede usar Event.

Por supuesto, al mismo tiempo, tenga en cuenta que cuando utilice el método join (), debe considerar los problemas de sincronización y exclusión mutua entre subprocesos o procesos para evitar puntos muertos y condiciones de carrera.

Supongo que te gusta

Origin blog.csdn.net/qq_43030934/article/details/132301123
Recomendado
Clasificación