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.