Python下线程之间的共享和释放示例


Posted in Python onMay 04, 2015

最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到 内存释放问题,导致越累越大

1.python 类变量 在多线程情况 下的 是共享的

2.python 类变量 在多线程情况 下的 释放是不完全的

3.python 类变量 在多线程情况 下没释放的那部分 内存 是可以重复利用的

import threading
 import time
  
 class Test:
  
   cache = {}
    
   @classmethod
   def get_value(self, key):
     value = Test.cache.get(key, [])
     return len(value)
  
   @classmethod
   def store_value(self, key, value):
     if not Test.cache.has_key(key):
       Test.cache[key] = range(value)
     else:
       Test.cache[key].extend(range(value))
     return len(Test.cache[key])
  
   @classmethod
   def release_value(self, key):
     if Test.cache.has_key(key):
       Test.cache.pop(key)
     return True
  
   @classmethod
   def print_cache(self):
     print 'print_cache:'
     for key in Test.cache:
       print 'key: %d, value:%d' % (key, len(Test.cache[key]))
  
 def worker(number, value):
   key = number % 5
   print 'threading: %d, store_value: %d' % (number, Test.store_value(key, value))
   time.sleep(10)
   print 'threading: %d, release_value: %s' % (number, Test.release_value(key))
  
 if __name__ == '__main__':
   thread_num = 10
    
   thread_pool = []
   for i in range(thread_num):
     th = threading.Thread(target=worker,args=[i, 1000000])
     thread_pool.append(th)
     thread_pool[i].start()
  
   for thread in thread_pool:
     threading.Thread.join(thread)
    
   Test.print_cache()
   time.sleep(10)
    
   thread_pool = []
   for i in range(thread_num):
     th = threading.Thread(target=worker,args=[i, 100000])
     thread_pool.append(th)
     thread_pool[i].start()
  
   for thread in thread_pool:
     threading.Thread.join(thread)
    
   Test.print_cache()
   time.sleep(10)

总结

公用的数据,除非是只读的,不然不要当类成员变量,一是会共享,二是不好释放。

Python 相关文章推荐
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
python解释器安装教程的方法步骤
Jul 02 Python
Python如何给函数库增加日志功能
Aug 04 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
OpenCV全景图像拼接的实现示例
Jun 05 Python
简单介绍Python中利用生成器实现的并发编程
May 04 #Python
简单分析Python中用fork()函数生成的子进程
May 04 #Python
python实现从字典中删除元素的方法
May 04 #Python
Python中利用原始套接字进行网络编程的示例
May 04 #Python
python通过索引遍历列表的方法
May 04 #Python
python实现将元祖转换成数组的方法
May 04 #Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 #Python
You might like
PHPShop存在多个安全漏洞
2006/10/09 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
python实现中文分词FMM算法实例
2015/07/10 Python
python字典基本操作实例分析
2015/07/11 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
python简单的三元一次方程求解实例
2020/04/02 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
特教教师先进事迹
2014/05/21 职场文书
志愿者个人总结
2015/03/03 职场文书
2015年中个人总结范文
2015/03/10 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android