Başka bir sorudaki bazı tartışmalar, çok parçalı Python programlarında kilitlemenin gerekli olduğu durumları daha iyi anlamam için beni teşvik etti. Python'da iş parçacığı üzerine this10 numaralı makalede, birden çok iş parçacığı paylaşılan durumu olduğunda ortaya çıkabilen birkaç sağlam, test edilebilir tuzak örneğine sahibim. Bu sayfada verilen örnek yarış durumu, sözlükte saklanan paylaşılan bir değişkeni okuyan ve işleyen iş parçacıkları arasındaki yarışları içerir. Bence burada bir yarış için durum çok açık ve neyse ki çok iyi bir şekilde test edilebilir. Bununla birlikte, liste ekleri veya değişken artışlar gibi atom işlemleriyle bir yarış koşulunu uyandırmayı başaramadım. Ben başarısızlık (100x 100k okuyuculu ekler) olmadan yukarıda testi varPython iş parçacığının paylaşılan durumu güvenli bir şekilde işleyebildiği bazı durumlar var mı?
from threading import Thread, Lock
import operator
def contains_all_ints(l, n):
l.sort()
for i in xrange(0, n):
if l[i] != i:
return False
return True
def test(ntests):
results = []
threads = []
def lockless_append(i):
results.append(i)
for i in xrange(0, ntests):
threads.append(Thread(target=lockless_append, args=(i,)))
threads[i].start()
for i in xrange(0, ntests):
threads[i].join()
if len(results) != ntests or not contains_all_ints(results, ntests):
return False
else:
return True
for i in range(0,100):
if test(100000):
print "OK", i
else:
print "appending to a list without locks *is* unsafe"
exit()
: Bu test etraflıca böyle bir yarış göstermeye çalışır. Kimseyi başarısızlığa uğratabilir mi? İş parçacığı tarafından atomik, artımlı, modifikasyon yoluyla yanlış davranabilecek bir başka nesne sınıfı var mıdır?
Bu 'atomik' anlambilimsel sözler Python'daki diğer işlemler için geçerli midir? Bu doğrudan GIL ile ilgili mi?
Eşzamanlı uygulamalarda test doğruluğu kanıtlamak için geçerli bir yöntem değildir. Sorunu asla tetiklemeyecek, beklenmedik şekilde tahmin edilebilir bir şekilde yürütmeye zorlamak için herhangi bir özel testin yapılması çok kolaydır, ancak koddaki en küçük değişiklik (ör.bunu gerçek bir dünya durumuna getirirken) kusuru anında gösterebilir. Eşzamanlı yazılımın doğruluğu kanıtlanmalı, test edilmemelidir. – Kylotan