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.