कोर्स
इस ट्यूटोरियल में, आप Python के sleep() फ़ंक्शन के बारे में जानेंगे, जो आपके प्रोग्राम के निष्पादन में विराम (delay) देने की सुविधा देता है। यह फ़ंक्शन तब विशेष रूप से उपयोगी होता है जब आपका प्रोग्राम थ्रेड्स के साथ काम कर रहा हो या जब आप ग्राफिक्स और एनीमेशन के साथ काम कर रहे हों। sleep फ़ंक्शन time मॉड्यूल में उपलब्ध है, जिसमें समय तक पहुँचने और रूपांतरण से जुड़ी कई अन्य फ़ंक्शन शामिल हैं। और यद्यपि यह मॉड्यूल सभी प्लेटफ़ॉर्म पर उपलब्ध है, इसके भीतर के सभी फ़ंक्शन हर जगह उपलब्ध हों ऐसा ज़रूरी नहीं, या वे हर प्लेटफ़ॉर्म पर बिल्कुल एक जैसे काम करें ऐसा भी नहीं। आइए time.sleep() मॉड्यूल को और विस्तार से देखते हैं...
Time मॉड्यूल
यह मॉड्यूल ऐसे फ़ंक्शन प्रदान करता है जो समय को परिवर्तित करने और उसे आपके प्रोग्राम में उपयोग करने में मदद करते हैं। आपके सिस्टम में तारीख और कैलेंडर के साथ अधिक सटीकता से काम करने वाले अन्य "सम्बद्ध" मॉड्यूल भी हैं, लेकिन यह मॉड्यूल मुख्यतः समय के साथ हेरफेर पर केंद्रित है — घंटे से लेकर मिलीसेकंड तक के स्तर पर काम करना।
कंप्यूटर विज्ञान की दुनिया में समय के साथ काम करते समय आप सामान्यतः जिस शब्द को सुनेंगे, वह है epoch।
लेकिन पहले, सुनिश्चित करें कि आपने time मॉड्यूल आयात (import) कर लिया है। ऐसा करने के लिए बस लिखें:
import time
epoch
यह वह सटीक बिंदु है जब समय वास्तव में शुरू हुआ माना जाता है। इसका मतलब हमारे सौरमंडल का जन्म या वह समय नहीं है जब मनुष्य ने समय नापना शुरू किया था, बल्कि यह वास्तव में अभी के अपेक्षाकृत क़रीब है। UNIX सिस्टम के लिए epoch है 1 जनवरी, 1970, 00:00:00 (UTC) (यदि आप सोच रहे थे तो वह गुरुवार था...) अपने सिस्टम पर epoch जानने के लिए आप लिख सकते हैं:
time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
यह आपको वर्ष (tm_year), माह (tm_mon), दिन (tm_mday), घंटा (tm_hour), मिनट (tm_min) और सेकंड (tm_sec) बताएगा। साथ ही सप्ताह का दिन (tm_wday) — यह 3 है क्योंकि सोमवार सप्ताह की शुरुआत मानी जाती है और उसे 0 के रूप में गिना जाता है। इसके बाद साल का दिन (tm_yday), जिसे जूलियन डे भी कहा जाता है, आता है। और अंत में, डेलाइट सेविंग फ्लैग (tm_isdst) — DST का अर्थ है daylight saving time। इस फ़ील्ड के मान 0, -1 या 1 हो सकते हैं। 0, यदि डेलाइट सेविंग प्रभावी नहीं है। 1, यदि डेलाइट सेविंग प्रभावी है, और -1, यदि जानकारी उपलब्ध नहीं है। क्यों उपलब्ध नहीं हो सकती? क्योंकि DST के नियम स्थानीय क़ानून द्वारा निर्धारित होते हैं और बदल सकते हैं।
अधिकांश कंप्यूटर समय और तारीख को 1 जनवरी, 1970, 00:00:00 (UTC) और संग्रहित किए जाने वाले समय के बीच गुज़रे सेकंडों के अंतर के रूप में स्टोर करते हैं। तो, यदि आप लिखें:
time.time()
1548611182.872067
यह आपको 1 जनवरी, 1970, 00:00:00 (UTC) से अब तक गुज़रे सेकंड बताएगा। इस अंतर को हम टाइमस्टैम्प या UNIX epoch time कहते हैं, और यह फ्लोटिंग-पॉइंट संख्या के रूप में होता है। खैर... सच कहें तो, यह अंतर सेकंडों में नहीं बल्कि ticks नामक इकाइयों में होता है। अधिकांश UNIX सिस्टमों में घड़ी एक सेकंड में 50 से 100 बार "टिक" करती है। इसलिए UNIX epoch time वास्तव में 1 जनवरी, 1970, 00:00:00 UTC से अब तक घटित टिक्स की संख्या है।
तो, अब जब आपको time मॉड्यूल के बारे में एक विचार हो गया है, तो आइए sleep() फ़ंक्शन पर नज़र डालें।
time.sleep()
सरल शब्दों में, time.sleep() को तर्क के रूप में वे सेकंड दिए जाते हैं जितने समय के लिए आप प्रोग्राम को अगले चरण पर बढ़ने से पहले रोकना या निलंबित करना चाहते हैं। इसे एक सरल प्रोग्राम की मदद से देखते हैं, जहाँ हम हर बार 5 सेकंड का विराम देकर वर्तमान समय को आउटपुट करते हैं — यानी हर प्रिंट के बीच 5 सेकंड का अंतर आता है। time.ctime() का उपयोग स्थानीय समय को सुगठित रूप में देखने में मदद करता है।
for count in range(5):
print(time.ctime())
# Prints the current time with a five second difference
time.sleep(5)
Sun Jan 27 18:46:24 2019
Sun Jan 27 18:46:29 2019
Sun Jan 27 18:46:34 2019
Sun Jan 27 18:46:39 2019
Sun Jan 27 18:46:44 2019
फ़ंक्शन का सिंटैक्स है: time.sleep(sec) जहाँ sec वह तर्क है जो बताता है कि प्रोग्राम को कितने सेकंड के लिए निलंबित करना है। यह फ़ंक्शन कोई मान वापस नहीं करता।
sec — यह तर्क वास्तव में एक फ्लोटिंग-पॉइंट संख्या होता है, इसलिए आप स्लीप समय को और सटीक बना सकते हैं। हालाँकि, इसमें थोड़ा संदेह रहता है क्योंकि वास्तविक निलंबन समय अनुरोधित समय से कम या मनमाने रूप से अधिक हो सकता है। इसे बेहतर समझने के लिए, कल्पना करें कि प्रोग्राम किसी दुकान में किसी दूसरे सेल्सपर्सन द्वारा संभाला जा रहा कोई काम है — जब आप प्रोग्राम को निलंबित करते हैं, तो उस पर काम करने वाला व्यक्ति तुरंत किसी दूसरे ग्राहक को सौंप दिया जाता है। लेकिन थोड़ी ही देर बाद (निर्दिष्ट स्लीप सेकंड से भी पहले), कोई और खाली सेल्सपर्सन काम उठा लेता है और उसे पूरा कर देता है — इसलिए निलंबन समय कम हो सकता है। इसी तरह, सभी सेल्सपर्सनों के कार्य शेड्यूल के कारण निलंबन समय अनुरोध से मनमाने तौर पर अधिक भी हो सकता है, और इसीलिए प्रोग्राम को अपनी बारी का इंतज़ार करना पड़ता है। आंतरिक रूप से, यह और भी जटिल है, और इसे संभालने के कई तरीके पहले से ही पेश किए जा चुके हैं।
for count in range(3):
print(time.ctime())
# Prints the current time with a five second difference
time.sleep(2.5)
Sun Jan 27 18:46:49 2019
Sun Jan 27 18:46:52 2019
Sun Jan 27 18:46:54 2019
Python इस फ़ंक्शन कॉल के व्यवहार के बारे में, विशेषकर क्रॉस-प्लेटफ़ॉर्म, कोई गारंटी नहीं देता। मूल कारण यह है कि इस मॉड्यूल में परिभाषित अधिकांश फ़ंक्शन प्लेटफ़ॉर्म के C लाइब्रेरी फ़ंक्शनों को उन्हीं नामों से कॉल करते हैं। सटीकता वास्तव में अंतर्निहित ऑपरेटिंग सिस्टम की स्लीप सटीकता पर निर्भर करती है, और यदि आपको आगे देखना हो — तो प्लेटफ़ॉर्म दस्तावेज़ों को देखना बेहतर होगा क्योंकि इन फ़ंक्शनों के सिमैंटिक्स प्लेटफ़ॉर्म के अनुसार भिन्न होते हैं।
हालाँकि, एक अच्छी खबर है: Python संस्करण 3.5 से शुरू होकर, time.sleep(secs) अब कम से कम उतना समय secs (दिया गया तर्क) सुलाता है, भले ही स्लीप किसी संकेत (signal) द्वारा बाधित कर दिया जाए (फिर से, ऊपर बताये गए सेल्सपर्सन जैसा संकेत मान लें), सिवाय इसके कि सिग्नल हैंडलर कोई अपवाद (exception) उठा दे।
तो, time.sleep() का उपयोग करते समय आंतरिक रूप से क्या होता है?
यह भाग फ़ंक्शन को और बेहतर समझने के लिए है, लेकिन फ़ंक्शन का उपयोग शुरू करने के लिए आवश्यक नहीं है। फ़ंक्शन वास्तव में System Clock का उपयोग करता है, जो कंप्यूटर में एक इलेक्ट्रॉनिक डिवाइस है जो उच्च-आवृत्ति का स्थिर सिग्नल जारी करता है, जो सभी आंतरिक घटकों को समकालिक करता है और प्रोसेसर का हिस्सा होता है। यह मॉड्यूल प्रोग्रामेबल अंतरालों पर Interrupt Requests (IRQs) उठाता है। IRQs उस वर्तमान कोड को बाधित करने के लिए ज़िम्मेदार होते हैं जिसे प्रोसेसर चला रहा होता है, वर्तमान स्थिति को सहेजते हैं, और ऑपरेटिंग सिस्टम में किसी अन्य कोड के हिस्से को नियंत्रण सौंप देते हैं।
तो, sleep() फ़ंक्शन करता यह है कि वह अधोस्तरीय I/O समापन रूटीन या asynchronous procedure call को कॉल करके प्रक्रिया को ब्लॉक करता है। OS यह नोट कर लेता है कि आप टाइमआउट अवधि पूरी होने तक और कुछ नहीं करना चाहते। जैसे ही यह टाइमआउट पूरा होता है, OS आपके प्रोसेस को अपनी याद रखी गई अंतिम स्थिति से फिर शुरू कर देता है। और आपकी नज़र में तो बस time.sleep() फ़ंक्शन का एक साधारण कॉल ही हुआ।
time.sleep() फ़ंक्शन में महारत हासिल करने पर बधाई। Python में फ़ंक्शनों के बारे में और जानने के लिए DataCamp का Python Data Science Toolbox (Part 1) कोर्स अवश्य देखें।