Heim  >  Artikel  >  Backend-Entwicklung  >  Teilen und Freigeben von Problemen mit Python-Klassenvariablen unter Multithreading

Teilen und Freigeben von Problemen mit Python-Klassenvariablen unter Multithreading

高洛峰
高洛峰Original
2016-10-18 10:32:201232Durchsuche

Ich wurde kürzlich durch Multithreading ausgetrickst. Mir war nicht klar, dass Klassenvariablen unter Multithreading geteilt werden. Außerdem war mir das Problem der Speicherfreigabe nicht bewusst, was mich immer müder machte.

1.Python-Klassenvariablen werden in Multi-Thread-Situationen gemeinsam genutzt

2. Die Freigabe von Python-Klassenvariablen in Multi-Thread-Situationen ist unvollständig

3 In Multi-Thread-Situationen freigegeben Der Teil des freigegebenen Speichers kann wiederverwendet werden.

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)

Öffentliche Daten werden nicht als Klassenmitgliedsvariable verwendet Und zweitens wird es schwierig sein, es freizugeben.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn