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 相关文章推荐
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
python原类、类的创建过程与方法详解
Jul 19 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Django学习之文件上传与下载
Oct 06 Python
python库matplotlib绘制坐标图
Oct 18 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
神经网络训练采用gpu设置的方式
Mar 03 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
初品cakephp 入门基础
2012/02/16 PHP
深入理解PHP中的global
2014/08/19 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
python3实现多线程聊天室
2018/12/12 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
使用python实现飞机大战游戏
2020/03/23 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
应届大专毕业生个人自荐信
2013/09/22 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书