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获取GY-85九轴模块信息示例
Dec 05 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
python中split方法用法分析
Apr 17 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
深入解析神经网络从原理到实现
Jul 26 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
python设置随机种子实例讲解
Sep 12 Python
pymysql模块的操作实例
Dec 17 Python
python如何基于redis实现ip代理池
Jan 17 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
Pytorch 卷积中的 Input Shape用法
Jun 29 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设计模式 Command(命令模式)
2011/06/26 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
PHP PDO操作总结
2014/11/17 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
英国自行车商店:AW Cycles
2021/02/24 全球购物
日语求职信范文
2013/12/17 职场文书
办公室经理岗位职责
2014/01/01 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis