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基础教程之lambda表达式使用方法
Feb 12 Python
Python3搜索及替换文件中文本的方法
May 22 Python
Python使用Matplotlib实现Logos设计代码
Dec 25 Python
Python Socket编程之多线程聊天室
Jul 28 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
Python中Proxypool库的安装与配置
Oct 19 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
python科学计算之scipy——optimize用法
Nov 25 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
Python使用tkinter实现小时钟效果
Feb 22 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
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
Python中函数的返回值示例浅析
2019/08/28 Python
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
2014年应届大学生自我评价
2014/01/09 职场文书
索桥的故事教学反思
2014/02/06 职场文书
趣味比赛活动方案
2014/02/15 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
个人授权委托书
2014/04/03 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书