概述

本文介绍多线程 共享内存,一个线程修改变量,一个线程访问变量

案例一

声明局部变量(该变量不能是数字或字符串),通过 Thread类的args参数,将局部变量传递给执行函数,让两个线程共享变量

1. #coding=utf-8
2. import threading
3. import time
4. import os
5. 
6. 
7. count=10
8. 
9. defmodifycount(nums):
10.     #获取当前线程对象
11.     t=threading.current_thread()
12.     for index in range(count):
13.         nums.append(index)
14.         print('%s,修改nums'%(t.name))
15. time.sleep(0.1)
16. 
17. defprintcount(nums):
18.     #获取当前线程对象
19.     t=threading.current_thread()
20.     for index in range(count):
21.         print('%s,nums=%s'%(t.name,nums))
22. time.sleep(0.1)
23. 
24. if __name__ == "__main__":
25.     print('pid=%d'%os.getpid())
26.     nums=[]
27.     #创建线程,此线程修改全局变量
28.     t=threading.Thread(target=modifycount,args=(nums,))
29.     #创建线程,此线程打印全局变量
30.     t2=threading.Thread(target=printcount,args=(nums,))
31.     t.start()
32.     t2.start()
33.     t.join()
34.     t2.join()
35.     print('主线程结束,nums=%s'%(nums))


执行结果:

python进程共享内存 python多线程共享内存_全局变量

这种方式与Process共享变量类似

传入数字或字符串类型的变量时

修改上面的代码,将局部变量改为数字或字符串,通过 Thread类的args参数传入变量,观察执行结果:



1. #coding=utf-8
2. import threading
3. import time
4. import os
5. 6. 7. count=10
8. 9. defmodifycount(num):
10.     #获取当前线程对象
11.     t=threading.current_thread()
12.     for index in range(count):
13.         num+=1
14.         print('%s,修改num,num=%d'%(t.name,num))
15. time.sleep(0.1)
16. 17. defprintcount(num):
18.     #获取当前线程对象
19.     t=threading.current_thread()
20.     for index in range(count):
21.         print('%s,num=%d'%(t.name,num))
22. time.sleep(0.1)
23. 24. if __name__ == "__main__":
25.     print('pid=%d'%os.getpid())
26.     num=0
27.     #创建线程,此线程修改全局变量
28.     t=threading.Thread(target=modifycount,args=(num,))
29.     #创建线程,此线程打印全局变量
30.     t2=threading.Thread(target=printcount,args=(num,))
31.     t.start()
32.     t2.start()
33.     t.join()
34.     t2.join()
35.     print('主线程结束,num=%d'%(num))



执行结果如下:

python进程共享内存 python多线程共享内存_python进程共享内存_02

说明:

  1. 数字类型(或字符串类型)的变量,传入函数时,是值传递,将值传递给modifycount()函数的形参num,printcount()函数的形参num
  2. 线程1修改的是modifycount()函数的形参num
  3. 线程2修改的是printcount()函数的形参num
  4. 主线程修改的局部变量num

python进程共享内存 python多线程共享内存_python进程共享内存_03

如上图,也就是说,这三处的num只是同名,但不是同一个num(相当于3个人同名,都是叫“家瑞”,但不是同一个人),打印的结果,线程1的num,线程2的num,主线程的num,不相同

案例二

声明全局变量,让多线程直接修改全局变量:

1. #coding=utf-8
2. import threading
3. import time
4. import os
5. 6. num=0
7. count=10
8. 9. defmodifycount():
10.     global num
11.     #获取当前线程对象
12.     t=threading.current_thread()
13.     for index in range(count):
14.         num+=1
15.         print('%s,修改num'%(t.name))
16. time.sleep(0.1)
17. 18. defprintcount():
19.     global num
20.     #获取当前线程对象
21.     t=threading.current_thread()
22.     for index in range(count):
23.         print('%s,num=%d'%(t.name,num))
24. time.sleep(0.1)
25. 26. if __name__ == "__main__":
27.     print('pid=%d'%os.getpid())
28.     #创建线程,此线程修改全局变量
29.     t=threading.Thread(target=modifycount)
30.     #创建线程,此线程打印全局变量
31.     t2=threading.Thread(target=printcount)
32.     t.start()
33.     t2.start()
34.     t.join()
35.     t2.join()
36.     print('主线程结束,num=%d'%(num))



执行结果如下图:

python进程共享内存 python多线程共享内存_全局变量_04

执行过程说明:
1.一个子线程让全局变量自增1
2.一个子线程打印全局变量,变量值也在自增1
3.最后主线程也打印全局变量,变量值也有变化

说明全局变量对于多线来说,是共用的,这与多进程操作全局变量不同

结论

多线程之间 共享内存

多线程共享全局变量的原因

由于多线程属于同一个进程,那么每个线程也就共享该进程的内存空间,全局变量在该进程的内存中,所以多线程可以共享全局变量

python进程共享内存 python多线程共享内存_全局变量_05