में एक लूप में लॉक करते समय थ्रेड भुखमरी मेरे पास एक ऐसा एप्लीकेशन है जो एक थ्रेड में लॉक में कुछ कार्य करता है। एक दूसरा थ्रेड भी है जो समय-समय पर से लॉक प्राप्त करना चाहता है। समस्या यह है कि, इस दूसरे थ्रेड को शायद ही कभी का मौका मिलता है, क्योंकि यह पहले काम करता है, क्योंकि पहले व्यक्ति हमेशा पहले लॉक करता है। मुझे आशा है कि निम्नलिखित कोड मैं क्या कहने की कोशिश कर रहा हूँ स्पष्ट होगा: आवेदन करने के लिए हो जाता हैपाइथन
import time
from threading import Lock, Thread
lock = Lock()
def loop():
while True:
with lock:
time.sleep(0.1)
thread = Thread(target=loop)
thread.start()
before = time.time()
lock.acquire()
print('Took {}'.format(time.time() - before))
तो print
तो आप देखेंगे कि यह जिस तरह से एक से अधिक सिर्फ 0.1s की जरूरत है। लेकिन कभी-कभी यह भी होता है कि यह अनिश्चित काल तक प्रतीक्षा करता है। मैंने इसे पाइथन 2.7.11 और पायथन 3.4.3 में डेबियन लिनक्स 8 पर परीक्षण किया है और यह समान रूप से काम करता है।
यह व्यवहार जवाबी सहज ज्ञान युक्त मेरे लिए है। loop
में लॉक जारी होने पर, lock.acquire
पहले ही इसकी रिलीज के लिए प्रतीक्षा कर रहा था और इसे तुरंत लॉक प्राप्त करना चाहिए। लेकिन इसके बजाय ऐसा लगता है कि लूप को लॉक पहले प्राप्त करने के लिए मिलता है, भले ही वह रिलीज़ पल पर रिलीज़ होने की प्रतीक्षा नहीं कर रहा था।
समाधान मैंने पाया खुला राज्य में प्रत्येक पाश यात्रा के बीच सोने के लिए है, लेकिन उस मुझे एक सुरुचिपूर्ण समाधान के रूप में हड़ताल नहीं करता, और क्या हो रहा है मुझे समझा है।
मुझे क्या याद आ रही है? CPython में
यदि आप पारस्परिक बहिष्करण के बजाय निर्धारक व्यवहार चाहते हैं, तो 'लॉक' उपयोग करने का सही ऑब्जेक्ट नहीं है .. आप 'time.sleep (0)' जारी करके एक कार्य स्विच को मजबूर करने में सक्षम हो सकते हैं लेकिन मैं हूं यकीन है कि कुछ प्लेटफॉर्म पर असफल हो जाएगा .. – thebjorn
ठीक है, मैंने यह पता लगाया है कि जब मेरे पास केवल दो धागे होते हैं तो जब कोई लॉक की प्रतीक्षा करता है तो यह हमेशा एक और अनलॉक के बाद ठीक हो जाएगा। मुझे आश्चर्य है कि ऐसा क्यों नहीं है। इसके अलावा, आपको क्या लगता है कि उपयोग करने के लिए एक उचित वस्तु होगी? –
यह कहना मुश्किल है कि यह क्यों हो रहा है, लेकिन अगर मुझे लगता है कि कार्य स्विच के साथ ऐसा कुछ करना होगा जैसे कि लूप रीपस कोड उस बिंदु तक पहुंच गया है जहां यह प्रतीक्षा धागे के बीच चयन करता है। लेकिन यह सिर्फ अनुमान लगा रहा है। – thebjorn