क्योंकि आप थ्रेडिंग नहीं कर रहे हैं (और मुझे लगता है कि यह जानबूझकर है और कुछ मामलों में बुद्धिमान है) आपको एक प्रकार की बाधा का उपयोग करना होगा। सिग्नल यूनिक्स सिस्टम पर एक प्रकार का व्यवधान है जो आपको कॉल के दौरान कॉलबैक पर लौटने की अनुमति देता है जो अवरुद्ध हो सकता है।
खुली हुई फ़ाइल का यह उदाहरण जो कभी वापस नहीं आएगी, आप जो करना चाहते हैं उसके अनुरूप है। इसे http://docs.python.org/library/signal.html#module-signal
से लिया गया है।लेकिन एक चेतावनी। चूंकि पायथन ओएस सिग्नल को संभालने के लिए ग्लोबल इंटरप्रेटर लॉक का उपयोग करता है, इसलिए यह कुछ स्थिरता समस्याओं के अधीन है। हालांकि ये समस्याएं सामान्य रूप से दुर्लभ होनी चाहिए।
import signal, os
def handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("Couldn't open device!")
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)
signal.alarm(0) # Disable the alarm