概述

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

案例一

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

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

执行结果:

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

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

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

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

执行结果如下:

说明:

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


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

案例二

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

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

执行结果如下图:

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

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

结论

多线程之间 共享内存

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

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

python-多线程共享内存相关推荐

  1. python多进程共享内存_python 进程间通信 共享内存

    python多进程通信实例分析 python多进程通信实例分析操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那 ...

  2. python进程共享内存_Python进程间通信之共享内存

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...

  3. GB28181系统设计(三)-进程通信让python获取共享内存数据

    GB28181系统设计 一 事件设计 GB28181系统设计 二 kdtree 算法 这一节说到了GB28181 系统接收到RTP包后,解码后交付给python做图像识别 流媒体服务依然是c++主打, ...

  4. python多线程共享全局变量_Python多线程-共享全局变量

    多线程-共享全局变量 import threading import time g_num = 200 def test1(): global g_num for i in range(5): g_n ...

  5. 多线程共享内存的问题

    如果你采用了多线程,并且在多线程中使用了全局变量进行内存共享,---出现里面的数据读不出来,一定要检查你在其他线程里面是否进行了重定义!!! 转载于:https://www.cnblogs.com/s ...

  6. python多进程共享内存

    1.问题: 群中有同学贴了如下一段代码,问为何 list 最后打印的是空值? from multiprocessing import Process, Manager import os manage ...

  7. python 共享内存 c_python共享内存 - DK's Blog - 博客园

    共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化. 共享内存是进程间最快速的通信方式: `进程共享 ...

  8. 共享内存进程线程混合通信

    多线程共享内存混合编程 /*threadWrite线程向共享内存写数据,threadRead线程从共享内存读数据*/ /*读线程必须等待写线程执行完才开始*/ #include <stdio.h ...

  9. php多线程 mysql_php通过共享内存,控制mysql连接数,多进程插入数据(pcnt学习四)...

    本人前一遍blog中提到,当进程数过多时,多进程插入mysql数据库表,超过了mysql最大连接数,就会报错,插入就会有失败的情况.想通过进程间通信来控制一下连接数,参考了一些网上的blog 实现了一 ...

最新文章

  1. 3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令
  2. 既然都说外企香,给你准备一波外企面经!
  3. 三部门发布18个新职业:含碳排放管理员、调饮师等
  4. jquery检测浏览器类型
  5. restfull知识点
  6. 13.5.SolrCloud集群使用手册之数据导入
  7. LeetCode-226. 翻转二叉树
  8. 消息中间件学习总结(18)——MQ常见面试题总结
  9. 5个python小游戏,python学习放松
  10. 数字图像处理第二次试验:图像增强
  11. java程序员待遇怎么样_现在的java程序员薪资待遇怎么样?
  12. 匹配 网络 Q值 带宽
  13. 微信小程序实现素材旋转——非canvas
  14. 二战中真正的打酱油船,神一样的存在
  15. 【物联网】老程序教你一招,10行代码让超声波模块秒变声控开关
  16. HTML:a标签锚点
  17. 计算机放音乐声音小在吗调,电脑放歌声音小怎么办
  18. 【C程序】逻辑判断真假话问题:3人说真话,1人说假话
  19. 阿里云支持备案不只是云服务器(支持备案云产品清单)
  20. 职高计算机论文,浅谈职高计算机的教学--专业论文.doc

热门文章

  1. 实战-动手开发第一个区块链投票DAPP
  2. 如何用MobaXterm查看日志信息以及xml
  3. 回归的误差服从正态分布吗_10大机器学习的回归类型,你会如何选择?
  4. 行存储索引改换成列存储索引_列存储索引增强功能–数据压缩,估计和节省
  5. 使用PowerShell和Windows任务计划程序备份Linux SQL Server数据库
  6. centos升级内核之后修改内核启动顺序
  7. 注意Chart control 中ispostback 的使用
  8. Java使用Swing实现五子棋。
  9. TLS握手、中断恢复与证书中心的原因
  10. PHP 中 new static 和 new self 的区别