Tôi có một tập lệnh nhỏ ngắtableloop.py chạy mã ở một khoảng thời gian (mặc định 1 giây), nó đưa ra một thông báo tới màn hình trong khi nó đang chạy và bẫy một tín hiệu ngắt mà bạn có thể gửi bằng CTL-C:
from interruptableLoop import InterruptableLoop
loop=InterruptableLoop(intervalSecs=1)
while loop.ShouldContinue():
pass
Khi bạn chạy tập lệnh và sau đó ngắt nó, bạn sẽ thấy đầu ra này, (các khoảng thời gian xuất hiện trên mỗi lần vượt qua của vòng lặp):
[py36]$ ./interruptexample.py
CTL-C to stop (or $kill -s SIGINT pid)
......^C
Exiting at 2018-07-28 14:58:40.359331
ruptableLoop.py :
"""
Use to create a permanent loop that can be stopped ...
... from same terminal where process was started and is running in foreground:
CTL-C
... from same user account but through a different terminal
$ kill -2 <pid>
or $ kill -s SIGINT <pid>
"""
import signal
import time
from datetime import datetime as dtt
__all__=["InterruptableLoop",]
class InterruptableLoop:
def __init__(self,intervalSecs=1,printStatus=True):
self.intervalSecs=intervalSecs
self.shouldContinue=True
self.printStatus=printStatus
self.interrupted=False
if self.printStatus:
print ("CTL-C to stop\t(or $kill -s SIGINT pid)")
signal.signal(signal.SIGINT, self._StopRunning)
signal.signal(signal.SIGQUIT, self._Abort)
signal.signal(signal.SIGTERM, self._Abort)
def _StopRunning(self, signal, frame):
self.shouldContinue = False
def _Abort(self, signal, frame):
raise
def ShouldContinue(self):
time.sleep(self.intervalSecs)
if self.shouldContinue and self.printStatus:
print( ".",end="",flush=True)
elif not self.shouldContinue and self.printStatus:
print ("Exiting at ",dtt.now())
return self.shouldContinue
time.sleep(5)
, miễn là bạn đã một số mã thụt vào bên dướiwhile True:
dòng (nó chỉ có thểpass
ở mức tối thiểu)