किसी अन्य प्रश्न में कुछ चर्चा ने मुझे उन मामलों को बेहतर ढंग से समझने के लिए प्रोत्साहित किया है जहां बहुप्रचारित पायथन कार्यक्रमों में लॉकिंग की आवश्यकता है।क्या ऐसे कुछ मामले हैं जहां पाइथन धागे सुरक्षित रूप से साझा राज्य में हेरफेर कर सकते हैं?
प्रति this पायथन में थ्रेडिंग पर आलेख, मेरे पास कई ठोस, परीक्षण योग्य उदाहरण हैं जो कई धागे साझा स्थिति तक पहुंच सकते हैं। इस पृष्ठ पर प्रदान की गई उदाहरण दौड़ की स्थिति में एक शब्दकोश में संग्रहीत साझा चर को पढ़ने और छेड़छाड़ करने वाले धागे के बीच दौड़ शामिल है। मुझे लगता है कि यहां एक दौड़ के मामले बहुत स्पष्ट हैं, और सौभाग्य से बेहद टेस्टेबल है।
हालांकि, मैं सूची परिशिष्ट या परिवर्तनीय वृद्धि जैसे परमाणु संचालन के साथ दौड़ की स्थिति को विकसित करने में असमर्थ रहा हूं।
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()
मैं विफलता (100x 100k बहु संलग्न कर देता है) के बिना ऊपर परीक्षण समाप्त हो गया है: इस परीक्षा विस्तृत रूप से इस तरह के एक दौड़ का प्रदर्शन करने के प्रयास करता है। क्या कोई इसे असफल कर सकता है? क्या ऑब्जेक्ट का एक और वर्ग है जिसे धागे द्वारा परमाणु, वृद्धिशील, संशोधन के माध्यम से गलत व्यवहार करने के लिए बनाया जा सकता है?
क्या इन अंतर्निहित 'परमाणु' अर्थशास्त्र पाइथन में अन्य परिचालनों पर लागू होते हैं? क्या यह सीधे जीआईएल से संबंधित है?
परीक्षण समवर्ती अनुप्रयोगों में शुद्धता साबित करने का एक वैध तरीका नहीं है। किसी भी विशेष परीक्षण के लिए किसी अप्रत्याशित रूप से अनुमानित तरीके से निष्पादन को अवरुद्ध करना बहुत आसान है जो समस्या को कभी भी ट्रिगर नहीं करेगा, फिर भी कोड में सबसे छोटा परिवर्तन (यानी।जब इसे वास्तविक दुनिया की स्थिति में विस्तारित किया जाता है) तुरंत दोष दिखा सकता है। समवर्ती सॉफ्टवेयर की शुद्धता साबित होनी चाहिए, परीक्षण नहीं किया जाना चाहिए। – Kylotan