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生成随机MAC地址
Mar 10 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
Python mutiprocessing多线程池pool操作示例
Jan 30 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
python怎么删除缓存文件
Jul 19 Python
python 19个值得学习的编程技巧
Aug 15 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
php 分页原理详解
2009/08/21 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
PHP中list方法用法示例
2016/12/01 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
详解python 中in 的 用法
2019/12/12 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
应届毕业生自我评价分享
2013/12/15 职场文书
高中政治教学反思
2014/01/18 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
医学会议开幕词
2016/03/03 职场文书
Pygame Draw绘图函数的具体使用
2021/11/17 Python