मैं इसे फ्लोटिंग पॉइंट नंबर दे सकता हूं, जैसे कि
time.sleep(0.5)
लेकिन यह कितना सही है? अगर मैं दे दूं
time.sleep(0.05)
क्या यह वास्तव में लगभग 50 एमएस सो जाएगा?
जवाबों:
Time.sleep फ़ंक्शन की सटीकता आपके अंतर्निहित OS की नींद सटीकता पर निर्भर करती है। गैर-रीयलटाइम ओएस के लिए एक स्टॉक विंडोज की तरह सबसे छोटा अंतराल जो आप सो सकते हैं वह लगभग 10-13ms है। मैंने उस समय के कई मिलीसेकंड के भीतर सटीक नींद देखी है जब न्यूनतम 10-13ms से ऊपर होता है।
अद्यतन: जैसा कि नीचे दिए गए डॉक्स में उल्लेख किया गया है, नींद को एक लूप में करना आम है जो यह सुनिश्चित करने के लिए वापस सो जाएगा कि यदि यह आपको जल्दी जगाता है।
मुझे यह भी उल्लेख करना चाहिए कि यदि आप उबंटू चल रहे हैं, तो आप आरटी कर्नेल पैकेज (कम से कम उबंटू 10.04 एलटीएस) को स्थापित करके एक छद्म वास्तविक समय कर्नेल (आरटी_प्रेट पैच सेट के साथ) आज़मा सकते हैं।
संपादित करें: सुधार गैर-वास्तविक समय लिनक्स कर्नेल में न्यूनतम नींद अंतराल 1ms से 10ms के करीब है, लेकिन यह गैर-नियतात्मक तरीके से भिन्न होता है।
sleep()
डॉक्स से कुछ अधिक महत्वपूर्ण काम में व्यस्त हैं "तो निलंबन समय के कारण एक मनमाना राशि द्वारा अनुरोध किए जाने की तुलना में अधिक लंबा हो सकता है। सिस्टम में अन्य गतिविधि "।
ऑपरेटिंग सिस्टम और गुठली के बीच अंतर के बारे में लोग काफी हद तक सही हैं, लेकिन मुझे उबंटू में कोई ग्रैन्युलैरिटी नहीं दिखती है और मुझे MS7 में 1 ms ग्रैन्युलैरिटी दिखाई देती है। समय के अलग क्रियान्वयन का सुझाव देते हुए सो जाएं, न कि केवल एक अलग टिक दर। क्लोजर निरीक्षण से उबंटू में 1μs की ग्रैन्युलैरिटी का पता चलता है, लेकिन यह उस समय के कारण होता है जब मैं सटीकता को मापने के लिए उपयोग करता हूं।
से प्रलेखन :
दूसरी ओर, सटीक
time()
औरsleep()
उनके यूनिक्स समकक्षों की तुलना में बेहतर है: समय को फ्लोटिंग पॉइंट नंबर के रूप में व्यक्त किया जाता है,time()
सबसे सटीक समय उपलब्ध (यूनिक्स का उपयोग करते हुएgettimeofday
उपलब्ध) देता है, औरsleep()
एक नॉनजरो अंश के साथ एक समय स्वीकार करेगा (यूनिक्सselect
का उपयोग किया जाता है) इसे लागू करने के लिए, जहां उपलब्ध है)।
और अधिक विशेष रूप से wrt sleep()
:
दिए गए सेकंड की संख्या के लिए निष्पादन को निलंबित करें। अधिक सटीक नींद के समय को इंगित करने के लिए तर्क एक अस्थायी बिंदु संख्या हो सकता है। वास्तविक निलंबन का समय उस अनुरोध से कम हो सकता है क्योंकि कोई भी पकड़ा गया संकेत
sleep()
उस सिग्नल के पकड़ने की दिनचर्या के निम्नलिखित निष्पादन को समाप्त कर देगा । साथ ही, सिस्टम में अन्य गतिविधि के समयबद्धन के कारण निलंबन समय एक मनमानी राशि द्वारा अनुरोध से अधिक हो सकता है।
यहाँ विल्बर्ट के उत्तर के लिए मेरा अनुगमन है: मैक ओएस एक्स योसेमाइट के लिए वही, क्योंकि इसका अभी तक उल्लेख नहीं किया गया है।
ऐसा लगता है कि आपके द्वारा अनुरोध किए जाने वाले समय का लगभग 1.25 गुना और आपके द्वारा अनुरोध किए जाने के समय और कभी-कभी 1 से 1.25 गुना के बीच सोता है। यह लगभग कभी नहीं (~ 1000 नमूनों में से दो बार) आपके द्वारा अनुरोध किए जाने के समय से 1.25 गुना अधिक सोता है।
इसके अलावा (स्पष्ट रूप से नहीं दिखाया गया है) 1.25 संबंध बहुत अच्छी तरह से पकड़ते हैं जब तक कि आप लगभग 0.2 एमएस से नीचे नहीं आते हैं, जिसके बाद यह थोड़ा फजी होने लगता है। इसके अतिरिक्त, वास्तविक समय आपके द्वारा अनुरोध किए गए समय से लगभग 5 एमएस से अधिक हो जाता है, जब अनुरोध किया गया समय 20 एमएस से ऊपर हो जाता है।
फिर, यह एक पूरी तरह से अलग कार्यान्वयन प्रतीत होता है sleep()
विंडोज़ या जो भी लिनक्स कर्नेल विल्बर्ट का उपयोग कर रहा था, की तुलना में ओएस एक्स में ।
आपको पता क्यों नहीं चला:
from datetime import datetime
import time
def check_sleep(amount):
start = datetime.now()
time.sleep(amount)
end = datetime.now()
delta = end-start
return delta.seconds + delta.microseconds/1000000.
error = sum(abs(check_sleep(0.050)-0.050) for i in xrange(100))*10
print "Average error is %0.2fms" % error
रिकॉर्ड के लिए, मुझे अपने HTPC पर लगभग 0.1ms त्रुटि और मेरे लैपटॉप पर 2ms, दोनों लिनक्स मशीनें मिली हैं।
एक छोटे से सुधार, कई लोग उल्लेख करते हैं कि नींद एक संकेत द्वारा जल्दी समाप्त हो सकती है। में 3.6 डॉक्स यह कहते हैं,
संस्करण 3.5 में परिवर्तित: फ़ंक्शन अब कम से कम सेकंड में सोता है, भले ही नींद एक सिग्नल से बाधित हो, सिवाय इसके कि सिग्नल हैंडलर एक अपवाद उठाता है (देखें तर्क के लिए पीईपी 475 देखें )।
आप वास्तव में नींद के बारे में कुछ भी गारंटी नहीं दे सकते हैं (), सिवाय इसके कि यह कम से कम सोने के लिए एक सर्वोत्तम प्रयास करेगा जब तक कि आपने इसे बताया (संकेत समय से पहले आपकी नींद को मार सकता है, और बहुत अधिक चीजें इसे चला सकती हैं लंबा)।
यह सुनिश्चित करने के लिए कि न्यूनतम मानक डेस्कटॉप ऑपरेटिंग सिस्टम पर आप 16ms (टाइमर ग्रैन्युलैरिटी प्लस टाइम टू रेफरेंस स्विच) के आसपास जा सकते हैं, लेकिन संभावना है कि दिए गए तर्क से% विचलन महत्वपूर्ण हो सकता है जब आप कोशिश कर रहे हों। सोने के लिए 10 मिली।
सिग्नल, जीआईएल धारण करने वाले अन्य धागे, कर्नेल शेड्यूलिंग फन, प्रोसेसर स्पीड स्टेपिंग, आदि सभी उस अवधि के साथ कहर ढा सकते हैं जब आपका धागा / प्रक्रिया वास्तव में सो जाती है।
हाल ही में विंडोज 10. पर पायथन 3.7 पर इसका परीक्षण किया गया। परिशुद्धता 1ms के आसपास थी।
def start(self):
sec_arg = 10.0
cptr = 0
time_start = time.time()
time_init = time.time()
while True:
cptr += 1
time_start = time.time()
time.sleep(((time_init + (sec_arg * cptr)) - time_start ))
# AND YOUR CODE .......
t00 = threading.Thread(name='thread_request', target=self.send_request, args=([]))
t00.start()
नींद के तर्क को पारित करने के लिए एक चर का उपयोग न करें (), आपको गणना को सीधे नींद में डालना होगा ()
और मेरे टर्मिनल की वापसी
1 ─────────────────── 17: 20: 16.891 20
2 ───── 17: 20: 18.891 20
3 20 17: 20: 20.891 20
4 ─────────────────── 17: 20: 22.891 20
5 ─────────────────── 17: 20: 24.891 20
....
689 ──────────────────── 17: 43: 12.891:
690 ──────────────────── 17: 43: 14.890:
691 ──────────────────── 17: 43: 16.891:
692 ──────────────────── 17: 43: 18.890:
693 ──────────────────── 17: 43: 20.891:
...
727 ──────────────────── 17: 44: 28.891:
728 ──────────────────── 17: 44: 30.891:
729 ──────────────────── 17: 44: 32.891:
730 44 17: 44: 34.890 44
731 ──────────────────── 17: 44: 36.891: