2015-03-27 30 views
5

hata karşılaştım 'RuntimeError: yineleme sırasında Sözlük değişti boyut' .Ben bulundu Python 2.7başka bir iş parçacığı takılı olan bir iş parçacığı bir sözlüğe, yineleme sırasında Küresel Intrepreter Kilidi kullanarak, biz olabilir o Bir nesnenin mutithreaded durumda kilitlemek.GIL'i çok iş parçacıklı bir uygulamada sözlük için nasıl kullanabilirim?

 In thread1: 
      dictDemo[callid]=val 
     in thread2: 
      for key in dictDemo: 
        if key in dictDemo: 
          dictDemo.pop(key,None) 

hatası karşılaştı 'RuntimeError: Sözlük yineleme sırasında boyutunu değiştirdi'.? Aynı zamanda çalışır thread1 beri thread2 içinde ** Ben thread2 içinde dictDemo sözlüğünü kilitlemek için GIL nasıl kullanabilirim ** Ya GIL sadece iş parçacığı için kullanılabilir mi yoksa nesneyi bir kerede 2 iş parçacığı ile kısıtlamak için sözlüğü kilitlemek için bir yol var mı?

+1

threading.Lock Nesnesini kullanabilirsiniz. – SolaWing

cevap

3

Python kodunuzu korumak için GIL'in kullanılması güvenli değil - GIL'yi ne zaman kaybedeceğinizi bilmek zor. GIL, tercümanınızı korumak için var, kodunuzu değil.

Sözlüğün kullanımını serileştirmeniz ve en kolay yolun bir Kilit nesnesini kullanmanız gerekir. thread1 olarak

from threading import Lock 
dLock = Lock() 

:

dLock.acquire() 
dictDemo[callid]=val 
dLock.release() 

thread2 içinde: Yapmak istediğiniz tüm sözlüğü temizlemek için ise arada

dLock.acquire() 
for key in dictDemo.keys(): 
    #if key in dictDemo: <-- not required! 
    dictDemo.pop(key,None) 
dLock.release() 

, dictDemo.clear() burada yararlı olabilir.

+0

Çalıştı ... Öneriniz için teşekkür ederiz .. –

İlgili konular