概述
本文介绍多线程 共享内存,一个线程修改变量,一个线程访问变量
案例一
声明局部变量(该变量不能是数字或字符串),通过 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))
这种方式与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))
说明:
- 数字类型(或字符串类型)的变量,传入函数时,是值传递,将值传递给modifycount()函数的形参num,printcount()函数的形参num
- 线程1修改的是modifycount()函数的形参num
- 线程2修改的是printcount()函数的形参num
- 主线程修改的局部变量num
如上图,也就是说,这三处的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))
执行过程说明:
1.一个子线程让全局变量自增1
2.一个子线程打印全局变量,变量值也在自增1
3.最后主线程也打印全局变量,变量值也有变化
说明全局变量对于多线来说,是共用的,这与多进程操作全局变量不同
结论
多线程之间 共享内存
多线程共享全局变量的原因
由于多线程属于同一个进程,那么每个线程也就共享该进程的内存空间,全局变量在该进程的内存中,所以多线程可以共享全局变量