2012-11-08 25 views
34

अगर मैं इसे प्राप्त करना चाहता हूं तो यह 5 मिनट के बाद थोड़ी देर लूप को कैसे रोक देगा।मैं थोड़ी देर के बाद थोड़ी देर लूप कैसे रोकूं?

while true: 
    test = 0 
    if test == 5: 
     break 
    test = test - 1 

इस कोड को मुझे एक अंतहीन लूप में फेंकता है।

उत्तर

61

निम्नलिखित का प्रयास करें:

import time 
timeout = time.time() + 60*5 # 5 minutes from now 
while True: 
    test = 0 
    if test == 5 or time.time() > timeout: 
     break 
    test = test - 1 

तुम भी एक छोटी नींद यहाँ जोड़ने के लिए तो यह पाश सीपीयू का अकेले नहीं है (शुरुआत या पाश शरीर के अंत में उदाहरण time.sleep(1) के लिए) कर सकते हैं।

+1

धन्यवाद इस काम करता है :) – Adilicious

+0

'timeit.default_timer' है, जो हमेशा मंच के लिए सबसे सटीक घड़ी है मैं का उपयोग करें। विशेष रूप से, 'time.time' में केवल 1/60 एस ग्रैन्युलरिटी है, जो आपके पास बहुत कम समय समाप्ति होने पर पर्याप्त नहीं हो सकता है। पायथन 3 पर, 'time.monotonic',' time.perf_counter', और 'time.process_time' भी है, जो बेहतर हो सकता है (मैंने उनमें से किसी के साथ निपटा नहीं है)। – jpkotta

+3

इस समाधान में प्रक्रिया करने के लिए बहुत सी शर्तें हैं। इसे अनुकूलित किया जाना चाहिए और 'जबकि True'' समय के साथ बदल दिया गया है। समय()

3
import time 

abort_after = 5 * 60 
start = time.time() 

while True: 
    delta = time.time() - start 
    if delta >= abort_after: 
    break 
25

इस मॉड्यूल का प्रयास करें: http://pypi.python.org/pypi/interruptingcow/

from interruptingcow import timeout 
try: 
    with timeout(60*5, exception=RuntimeError): 
     while True: 
      test = 0 
      if test == 5: 
       break 
      test = test - 1 
except RuntimeError: 
    pass 

सादर

+26

दस्तक नॉक - वहां कौन है? - बाधित गाय - हस्तक्षेप गाय - ** मूओ **! –

+0

hahahah =) और सबकुछ बंद हो जाता है! = पी – andrefsp

+2

यह समाधान मेरी राय में स्वीकार्य उत्तर होना चाहिए। यह बहुत बेहतर प्रदर्शन करता है, यानी। दी गई अवधि के दौरान लूप के अंदर बहुत अधिक कोड निष्पादित होते हैं। – domoarrigato

22

इस मामले में आपको while True: पाश का उपयोग करने की जरूरत नहीं है। सीधे समय शर्त का उपयोग करने के लिए एक बहुत सरल तरीका है:

import time 

# timeout variable can be omitted, if you use specific value in the while condition 
timeout = 300 # [seconds] 

timeout_start = time.time() 

while time.time() < timeout_start + timeout: 
    test = 0 
    if test == 5: 
     break 
    test -= 1 
+0

नींद का उपयोग करके सीपीयू को इस फ़ंक्शन द्वारा लोड होने से रोकने की संभावित आवश्यकता का उल्लेख क्यों नहीं करते? यह कोड काम कर सकता है, लेकिन यह सिस्टम संसाधनों का उपयोग नहीं करेगा। – Anthony

+0

एंथनी, क्या आप समझा सकते हैं कि यह "सिस्टम संसाधनों का अनावश्यक रूप से उपयोग क्यों करेगा?" मैं वास्तव में उत्सुक हूं और थोड़ा उलझन में हूं; इस इस्तेमाल किए गए समय से ऊपर कोई और नहीं। नींद()। जबकि वक्तव्य कथन सिस्टम संसाधनों में तर्क-जांच क्यों डालेंगे? –

+0

जबकि लूप स्थिति में टाइमआउट चेक डालने के बारे में अच्छा बिंदु। 'Time.sleep()' के बारे में टिप्पणी के लिए, कोड कोई काम नहीं करता है, इसलिए लूप के माध्यम से जितना तेज़ हो सके उतना तेज़ होगा। एक छोटा 'time.sleep()' जोड़कर सीपीयू कोई काम नहीं करते समय पूर्ण शक्ति पर चलने के बजाय निष्क्रिय हो सकता है। – Baldrickk

2

पेट्र Krampl का जवाब मेरी राय है, लेकिन अधिक की जरूरत में सबसे अच्छा छोरों की प्रकृति और कैसे प्रणाली के उपयोग का अनुकूलन करने के लिए के बारे में कहा जा रहा है । इस धागे पर होने वाले शुरुआती प्रश्न और मौजूदा उत्तरों में तार्किक और एल्गोरिदमिक त्रुटियों से और भ्रमित हो सकते हैं।

पहले, आइए देखते हैं कि आपके कोड के रूप में आप मूल रूप से यह लिखा है:

while True: 
    test = 0 
    if test == 5: 
     break 
    test = test - 1 

आप एक पाश संदर्भ में कहते हैं while True, सामान्य रूप से अपने इरादे हमेशा के पाश में रहने के लिए है। यदि यह आपका इरादा नहीं है, तो आपको लूप की संरचना के लिए अन्य विकल्पों पर विचार करना चाहिए। पेट्र क्रैम्पल ने आपको इसे संभालने का एक बिल्कुल सही तरीका दिखाया है जो आपके कोड को पढ़ने वाले किसी और के लिए अधिक स्पष्ट है। इसके अतिरिक्त, यह आपके लिए अधिक स्पष्ट होगा कि कई महीनों बाद आपको कुछ जोड़ने या ठीक करने के लिए अपने कोड पर फिर से जाना चाहिए। अच्छी तरह से लिखित कोड आपके दस्तावेज़ का हिस्सा है। चीजों को करने के लिए आमतौर पर कई तरीके होते हैं, लेकिन यह सभी संदर्भों में सभी तरीकों को समान रूप से मान्य नहीं करता है। while true विशेष रूप से इस संदर्भ में इसका एक अच्छा उदाहरण है।

अगला, हम आपके मूल कोड में एल्गोरिदमिक त्रुटि देखेंगे। लूप में आप जो पहली चीज करते हैं वह 0 से test असाइन की जाती है। आपके द्वारा की जाने वाली अगली चीज़ यह जांचना है कि test का मान 5 है, जो तब तक मामला नहीं होगा जब तक कि आपके पास समान स्मृति स्थान को संशोधित करने वाले एकाधिक धागे न हों। थ्रेडिंग इस चर्चा के दायरे में नहीं है, लेकिन यह ध्यान देने योग्य है कि कोड तकनीकी रूप से काम कर सकता है, लेकिन कई धागे के साथ भी बहुत कुछ गायब होगा, उदा। सेमाफोर। वैसे भी, आप इस लूप में हमेशा इस तथ्य के बावजूद बैठेंगे कि सेंटीनल एक अनंत लूप को मजबूर कर रहा है।

कथन test = test - 1 बेकार के अगले पुनरावृत्ति की शुरुआत में वैरिएबल रीसेट होने पर यह बेकार है क्योंकि यह क्या करता है। यहां तक ​​कि यदि आपने इसे test = 5 में बदल दिया है, तो लूप अभी भी अनंत होगा क्योंकि मान हर बार रीसेट होता है। यदि आप लूप के बाहर प्रारंभिक विवरण को स्थानांतरित करते हैं, तो कम से कम इसे बाहर निकलने का मौका मिलेगा।

test = 0 
while True: 
    test = test - 1 
    if test == 5: 
     break 

पाश में बयान के लिए अपने कार्यक्रम के तर्क पर निर्भर करता है: क्या आप का इरादा हो सकता है कुछ इस तरह था।यह किसी भी क्रम में काम करेगा, हालांकि, मुख्य बिंदु कौन सा है।

अगले अंक 0 पर शुरू, लगातार 1 घटाकर, और फिर एक सकारात्मक संख्या के साथ तुलना की क्षमता और संभावित तार्किक त्रुटि है। हाँ, वहाँ अवसरों जहां यह वास्तव में आप जब तक आप निहितार्थ समझते हैं करने का इरादा क्या हो सकता है, लेकिन इस सबसे तुम क्या नहीं इरादा संभावना है। अजगर के नए संस्करण के आसपास लपेट नहीं होगा जब आप सी और विभिन्न अन्य भाषाओं की तरह एक पूर्णांक की सीमा से निम्नतम तक पहुँचते हैं। यह आपको 1 घटाना जब तक आप अपने सिस्टम या कम से कम क्या आपके प्रक्रिया के लिए आवंटित है पर उपलब्ध स्मृति भर दिया जारी रखने के लिए अनुमति देता है। निम्न स्क्रिप्ट और परिणाम को देखो:

test = 0 

while True: 
    test -= 1 

    if test % 100 == 0: 
     print "Test = %d" % test 

    if test == 5: 
     print "Test = 5" 
     break 

जो इस निर्माण करता है:

Test = -100 
Test = -200 
Test = -300 
Test = -400 
... 
Test = -21559000 
Test = -21559100 
Test = -21559200 
Test = -21559300 
... 

test का मूल्य 5 कभी नहीं होगा, तो यह पाश कभी नहीं बाहर हो जाएगा।

import time 

test = 0 
timeout = 300 # [seconds] 

timeout_start = time.time() 

while time.time() < timeout_start + timeout: 
    if test == 5: 
     break 
    test -= 1 

यह अभी भी के आधार पर नहीं तोड़ देगा:

पेट्र Krampl के जवाब देने के लिए जोड़ने के लिए, यहाँ एक संस्करण शायद समय की एक निश्चित अवधि के बाद पाश बाहर निकलने के लिए क्या आप वास्तव में इसके अलावा में इरादा के करीब है कि है test का मूल्य है, लेकिन यह एक उचित प्रारंभिक शर्त के साथ एक पूरी तरह से वैध पाश है। आगे की सीमा जांच आपको किसी भी कारण के लिए बहुत लंबे लूप के निष्पादन से बचने में मदद कर सकती है, उदा। जांच करें कि लूप एंट्री पर परीक्षण का मूल्य 5 से कम है, जो तुरंत लूप को तोड़ देगा।


एक अन्य बात का उल्लेख किया जाना चाहिए कि कोई अन्य उत्तर संबोधित नहीं किया गया है। कभी-कभी आप इस तरह पाश, तुम नहीं पूरे आवंटित समय के लिए CPU उपभोग करने के लिए चाहते हो सकता है जब। उदाहरण के लिए, कहें कि आप किसी दूसरे के मूल्य की जांच कर रहे हैं जो हर सेकेंड में बदल जाता है। यदि आप किसी प्रकार की देरी नहीं पेश करते हैं, तो आप अपनी प्रक्रिया में आवंटित प्रत्येक उपलब्ध सीपीयू चक्र का उपयोग करेंगे। यह जरूरी है कि यह आवश्यक है, लेकिन अच्छा डिज़ाइन उपलब्ध संसाधनों को ओवरबर्ड किए बिना आपके सिस्टम पर समानांतर में कई प्रोग्राम चलाने की अनुमति देगा। एक साधारण नींद का बयान आपकी प्रक्रिया में आवंटित सीपीयू चक्रों के विशाल बहुमत को मुक्त कर देगा ताकि अन्य कार्यक्रम काम कर सकें।

निम्नलिखित उदाहरण बहुत उपयोगी नहीं है, लेकिन यह अवधारणा का प्रदर्शन करता है। मान लें कि आप हर सेकेंड कुछ प्रिंट करना चाहते हैं। एक तरह से यह करने के लिए इस तरह होगा:

import time 

tCurrent = time.time() 

while True: 
    if time.time() >= tCurrent + 1: 
     print "Time = %d" % time.time() 
     tCurrent = time.time() 

उत्पादन इस होगा:

Time = 1498226796 
Time = 1498226797 
Time = 1498226798 
Time = 1498226799 

और प्रक्रिया CPU उपयोग इस प्रकार दिखाई देगा:

enter image description here

है कि मूल रूप से कोई काम करने के लिए सीपीयू उपयोग की एक बड़ी मात्रा।इस कोड को बहुत प्रणाली के आराम करने के अच्छे है:

import time 

tCurrent = time.time() 

while True: 
    time.sleep(0.25) # sleep for 250 milliseconds 
    if time.time() >= tCurrent + 1: 
     print "Time = %d" % time.time() 
     tCurrent = time.time() 

उत्पादन ही है:

Time = 1498226796 
Time = 1498226797 
Time = 1498226798 
Time = 1498226799 

और CPU उपयोग जिस तरह से, जिस तरह से कम है:

enter image description here

0

मैं जिस व्यक्ति का उपयोग कर रहा हूं उसे साझा करना चाहता हूं:

import time 
# provide a waiting-time list: 
lst = [1,2,7,4,5,6,4,3] 
# set the timeout limit 
timeLimit = 4 

for i in lst: 
    timeCheck = time.time() 
    while True: 
     time.sleep(i) 
     if time.time() <= timeCheck + timeLimit: 
      print ([i,'looks ok']) 
      break 
     else: 
      print ([i,'too long']) 
      break 
,210

तो फिर तुम मिल जाएगा:

[1, 'looks ok'] 
[2, 'looks ok'] 
[7, 'too long'] 
[4, 'looks ok'] 
[5, 'too long'] 
[6, 'too long'] 
[4, 'looks ok'] 
[3, 'looks ok'] 
संबंधित मुद्दे