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)
总结
公用的数据,除非是只读的,不然不要当类成员变量,一是会共享,二是不好释放。