I. Introducción
En la programación multiproceso y multiproceso de Python, join()
ambas Event
son 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
Event
Es un mecanismo de sincronización de subprocesos o procesos, utilizado principalmente para la comunicación entre subprocesos. A Event
representa 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 actualEvent
y 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;Event
la 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.
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 threading
el 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.
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 threading
se ejecuta antes del bucle for y no espera a que termine de ejecutarse el código del bucle for.
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.