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装饰器 免去调用父类构造函数的麻烦
May 18 Python
python合并文本文件示例
Feb 07 Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
详解python数据结构和算法
Apr 18 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
PyQt5中QSpinBox计数器的实现
Jan 18 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
ES6中的箭头函数实例详解
2017/04/06 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
python3 反射的四种基本方法解析
2019/08/26 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
材料成型专业个人求职信范文
2013/09/25 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
员工工作能力评语
2014/12/31 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
大学军训心得体会800字
2016/01/11 职场文书
小学科学课教学反思
2016/02/23 职场文书
python中的getter与setter你了解吗
2022/03/24 Python