break/interrupt a time.sleep() in python

后端 未结 6 1464
猫巷女王i
猫巷女王i 2020-12-01 03:30

I need to break from time.sleep() using ctrl c.

While 1:
    time.sleep(60)

In the above code when the control enters time.sleep function a

6条回答
  •  不知归路
    2020-12-01 03:52

    The correct answer is to use python stdlib's threading.Event

    Sure you can tune down your sleep interval so you sleep for very short periods, but what if you actually want to run your loop once every 60s? Then you need to do more work to determine if it's time to run or just keep sleeping. Furthermore, you're still technically blocking but for only a short period of time. Contrast to threading.Event:

    from threading import Event
    
    exit = Event()
    
    def main():
        while not exit.is_set():
          do_my_thing()
          exit.wait(60)
    
        print("All done!")
        # perform any cleanup here
    
    def quit(signo, _frame):
        print("Interrupted by %d, shutting down" % signo)
        exit.set()
    
    if __name__ == '__main__':
    
        import signal
        for sig in ('TERM', 'HUP', 'INT'):
            signal.signal(getattr(signal, 'SIG'+sig), quit);
    
        main()
    

    When the signal handler calls exit.set(), the main thread's wait() call will immediately be interrupted.

    Now, you could use an Event to signal that there's more work to do, etc. But in this case it does double duty as a convenient indicator that we want to quit (e.g. the while not exit.is_set() part.)

    You also have the option to put any cleanup code after your while loop.

提交回复
热议问题