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将ansible配置转为json格式实例代码
May 15 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
Python远程视频监控程序的实例代码
May 05 Python
python Django里CSRF 对应策略详解
Aug 05 Python
使用python实现画AR模型时序图
Nov 20 Python
python小项目之五子棋游戏
Dec 26 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
python中pdb模块实例用法
Jan 15 Python
python和opencv构建运动检测器的实现
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
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
python读取中文txt文本的方法
2018/04/12 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
事业单位鉴定材料
2014/05/25 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
2015年见习期工作总结
2014/12/12 职场文书
会议主持人开场白台词
2015/05/28 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
V Rising 服务器搭建图文教程
2022/06/16 Servers