Python下线程之间的共享和释放示例
最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到内存释放问题,导致越累越大
1.python类变量在多线程情况下的是共享的
2.python类变量在多线程情况下的释放是不完全的
3.python类变量在多线程情况下没释放的那部分内存是可以重复利用的
importthreading
importtime
classTest:
cache={}
@classmethod
defget_value(self,key):
value=Test.cache.get(key,[])
returnlen(value)
@classmethod
defstore_value(self,key,value):
ifnotTest.cache.has_key(key):
Test.cache[key]=range(value)
else:
Test.cache[key].extend(range(value))
returnlen(Test.cache[key])
@classmethod
defrelease_value(self,key):
ifTest.cache.has_key(key):
Test.cache.pop(key)
returnTrue
@classmethod
defprint_cache(self):
print'print_cache:'
forkeyinTest.cache:
print'key:%d,value:%d'%(key,len(Test.cache[key]))
defworker(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=[]
foriinrange(thread_num):
th=threading.Thread(target=worker,args=[i,1000000])
thread_pool.append(th)
thread_pool[i].start()
forthreadinthread_pool:
threading.Thread.join(thread)
Test.print_cache()
time.sleep(10)
thread_pool=[]
foriinrange(thread_num):
th=threading.Thread(target=worker,args=[i,100000])
thread_pool.append(th)
thread_pool[i].start()
forthreadinthread_pool:
threading.Thread.join(thread)
Test.print_cache()
time.sleep(10)
总结
公用的数据,除非是只读的,不然不要当类成员变量,一是会共享,二是不好释放。