2011-12-08 9 views
6

* निक्स पायथन सिग्नलिंग मुझे तैयार होने से पहले नींद को रोकने की अनुमति देता है। क्या विंडोज़ में कोई भी समान तंत्र उपलब्ध है - ऐसा लगता है कि सभी विधियां नींद के बाद ही कोड को रोकती हैं?क्या समय रोकने के लिए कोई तरीका है। खिड़कियों में सो जाओ?

कोड उदाहरण:

from time import sleep 
.. do something that will intercept the sleep 
try: 
    sleep(60) 
finally: 
    print 'how to get here under 60 seconds in windows?' 

इसी प्रकार के प्रश्न है कि खिड़कियों के लिए एक जवाब नहीं है: break/interrupt a time.sleep() in python

signal के लिए
+5

क्या आप अपना कोड लिख सकते हैं, इसलिए यह 60 के समय के साथ 'थ्रेडिंग.इवेंट' पर इंतजार कर रहा है, और यदि आप प्रतीक्षा रद्द करना चाहते हैं तो उस घटना को किसी अन्य थ्रेड से हिट करें? –

+1

पहले क्लासिक विराम चिह्न को पार करते हुए वाक्य को पढ़ें। इच्छा है कि कहीं सोकर समय रुकने का एक तरीका था। – Simon

+0

यह मेरा कोड नहीं है। यह अनजान क्लाइंट कोड है जिसे मैं टाइमआउट के बाद रुकने की कोशिश कर रहा हूं। ऐसा लगता है कि cpython में वास्तव में कोई अच्छा तंत्र मौजूद नहीं है .. और हाँ हमने थ्रेड और उपप्रोसेस भी कोशिश की है। – mkorpela

उत्तर

4

अजगर प्रलेखन कहते हैं:

• अजगर संकेत संचालकों हालांकि तक अतुल्यकालिक रूप से कहा जाता है, पाइथन उपयोगकर्ता चिंतित है, वे केवल वें के बीच हो सकते हैं ई "परमाणु" पायथन दुभाषिया के निर्देश। इसका मतलब है कि लंबे समय तक गणना के दौरान संकेतों को सी में लागू किया गया है (जैसे टेक्स्ट के बड़े निकायों पर नियमित अभिव्यक्ति मिलान) के लिए मनमाने ढंग से समय के लिए देरी हो सकती है।

जबकि time का कहना है:

वास्तविक निलंबन समय का अनुरोध किया है क्योंकि किसी भी पकड़ा संकेत नींद() कि संकेत के पकड़ने दिनचर्या के निष्पादन निम्नलिखित समाप्त होगा कि कम से कम हो सकता है।

Windows पर, जाहिरा तौर पर time.sleep() प्रलेखन के अनुसार लागू नहीं किया गया, क्योंकि एक संकेत के लिए हैंडलर नींद के दौरान प्राप्त होने पर जब तक नींद की पूरी अवधि समाप्त हो गया है कार्रवाई नहीं की है। निम्न उदाहरण:

import signal, time 

def handler(signum, frame): 
    print('Signal handler called with signal', signum) 

signal.signal(signal.SIGINT, handler) 

print("signal set, sleeping") 
time.sleep(10) 
print("sleep done") 

प्रिंट:

signal set, sleeping 
Signal handler called with signal 2 
sleep done 
पहली पंक्ति तुरंत होने के साथ

और दूसरे दो 10 के बाद सेकंड, जब व्यवधान होता है की परवाह किए बिना।

जैसा थॉमस के सुझाव देता है, थ्रेड और सिंक्रनाइज़ेशन का उपयोग करने के लिए एक बेहतर रणनीति होगी।

1

मैं अगर यह यह तुम्हारे लिए क्या करेंगे यकीन नहीं है, लेकिन यहां एक छोटे से वैकल्पिक हल आप कर सकते हैं:

for i in range(60): 
    if checkIfIShouldInterruptSleep(): 
     break 
    time.sleep(1) 
print "Finished Sleeping!" 

यह केवल दूसरी करने के लिए सही है, लेकिन यह अपने उद्देश्य पूरा हो सकता है। हैप्पी कोडिंग!

संबंधित मुद्दे

 संबंधित मुद्दे