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 相关文章推荐
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
django初始化数据库的实例
May 27 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
python获取服务器响应cookie的实例
Dec 28 Python
python实现批量注册网站用户的示例
Feb 22 Python
opencv+python实现均值滤波
Feb 19 Python
python 伯努利分布详解
Feb 25 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
python 列表推导和生成器表达式的使用
Feb 01 Python
利用Opencv实现图片的油画特效实例
Feb 28 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
PHP实现计算器小功能
2020/08/28 PHP
DWR Ext 加载数据
2009/03/22 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
Python shutil模块用法实例分析
2019/10/02 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
深入了解Python enumerate和zip
2020/07/16 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
介绍一些UNIX常用简单命令
2014/11/11 面试题
办公室前台岗位职责
2014/01/04 职场文书
认识深刻的检讨书
2014/02/16 职场文书
同学聚会感言一句话
2015/07/30 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL