El problema de multihilo compartiendo variables globales en Python

Escribe algunas palabras con P que tienes que leer al frente:

Los datos de las variables globales se pueden compartir entre varios subprocesos en Python.

Sin embargo, compartir variables globales con múltiples subprocesos puede ser problemático.

Asumiendo que dos subprocesos t1 y t2 suman 1 a la variable global g_num (el valor predeterminado es 0), t1 y t2 cada uno suma 10 veces a g_num, y el resultado final de g_num debería ser 20.

Sin embargo, dado que varios subprocesos funcionan al mismo tiempo, pueden ocurrir las siguientes situaciones:

Cuando g_num=0, t1 obtiene g_num=0. En este momento, el sistema programa t1 en el estado "dormido", convierte t2 en el estado "en ejecución" y t2 también obtiene g_num=0.

Luego t2 suma 1 al valor obtenido y lo asigna a g_num, de modo que g_num=1.

Luego, el sistema programa t2 para "dormir" y t1 para "ejecutar". El subproceso t1 agrega 0 a g_num nuevamente después de agregar 1 al 0 obtenido anteriormente.

Esto da como resultado que, aunque tanto t1 como t2 suman 1 a g_num, el resultado sigue siendo g_num=1.

Veamos un ejemplo:

import threading
import time

g_num = 0

def work1(num):
    global g_num
    for i in range(num):
        g_num += 1
    print("----in work1, g_num is %d---" % g_num)

def work2(num):
    global g_num
    for i in range(num):
        g_num += 1
    print("----in work2, g_num is %d---" % g_num)

print("---线程创建之前g_num is %d---" % g_num)

t1 = threading.Thread(target=work1, args=(100,))
t1.start()

t2 = threading.Thread(target=work2, args=(100,))
t2.start()

# 确保子线程都运行结束
while len(threading.enumerate()) != 1:
    time.sleep(1)

print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)

resultado de la operación:

---线程创建之前g_num is 0---
----in work1, g_num is 100---
----in work2, g_num is 200---
2个线程对同一个全局变量操作之后的最终结果是:200

A primera vista, no parece haber ningún problema. Esto se debe a que los datos son demasiado pequeños, ahora hacemos que los datos sean más grandes.

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:660193417
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import threading
import time

g_num = 0

def work1(num):
    global g_num
    for i in range(num):
        g_num += 1
    print("----in work1, g_num is %d---" % g_num)

def work2(num):
    global g_num
    for i in range(num):
        g_num += 1
    print("----in work2, g_num is %d---" % g_num)

print("---线程创建之前g_num is %d---" % g_num)

t1 = threading.Thread(target=work1, args=(1000000,))
t1.start()

t2 = threading.Thread(target=work2, args=(1000000,))
t2.start()

# 确保子线程都运行结束
while len(threading.enumerate()) != 1:
    time.sleep(1)

print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)

resultado de la operación:

---线程创建之前g_num is 0---
----in work2, g_num is 1048576---
----in work1, g_num is 1155200---
2个线程对同一个全局变量操作之后的最终结果是:1155200

Cuanto mayor sea el número, mayor será la probabilidad de problemas y mayor será el sesgo en los datos.

En conclusión

Si varios subprocesos operan en la misma variable global al mismo tiempo, habrá un problema de contención de recursos y el resultado de los datos será incorrecto.

Supongo que te gusta

Origin blog.csdn.net/m0_67575344/article/details/124150861
Recomendado
Clasificación