760

How do I get my Python program to sleep for 50 milliseconds?

martineau
  • 119,623
  • 25
  • 170
  • 301
TK.
  • 46,577
  • 46
  • 119
  • 147

6 Answers6

1135

Use time.sleep()

from time import sleep
sleep(0.05)
Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Will Boyce
  • 11,663
  • 1
  • 17
  • 15
  • 2
    But how does it *actually* work? E.g., will the actual time resolution often be 16.66 ms (1/60 second)? In this particular case the sleep time happens to be *exactly* 3 times the time resolution. However, what about rounding? What if 3 is actually 2.9999999 due to floating point operations and it is rounded down to 2 (actual sleep time = 0.0333333 s = 33.33 ms)? – Peter Mortensen Feb 06 '21 at 23:01
  • 1
    It is extremely unlikely that the python code base will round sleep(0.05) into 2 system clock ticks. It will mostly likely request 3 clock ticks because that's the right answer. BUT the system might return after 3 or 4 or 5 or 100 clock ticks. There's no guarantee it will return after 3 clock ticks if it is busy doing something else like flush data to the disk. Definitely DON'T use this if timing is critical. You would have to write code at the driver level to leverage interrupts if you want super accurate sleep intervals. – Mark Lakata Mar 03 '22 at 01:11
119

Note that if you rely on sleep taking exactly 50 ms, you won't get that. It will just be about it.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
ya23
  • 14,226
  • 9
  • 46
  • 43
  • 48
    It might be 10 or 15ms longer than that on some platforms, so be warned. – Kylotan Jan 17 '09 at 18:41
  • 5
    Is it a consistent delay on a given system? – user391339 Feb 18 '18 at 22:00
  • 12
    @user391339 From experience it is not consistent. Thread/process priority, CPU load avg, available memory, and a plethora of other factors make all calls imprecise. The busier the system is, the higher the imprecision. – David Jan 28 '19 at 18:44
  • 11
    Might be interesting to know though that 'the function [`time.sleep(secs)`] sleeps *at least* `secs`' since Python 3.5 according to the documentation. – Elias Strehle Oct 30 '19 at 14:11
95

Use time.sleep():

import time
time.sleep(50 / 1000)

See the Python documentation: https://docs.python.org/library/time.html#time.sleep

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Dan Olson
  • 1,282
  • 9
  • 7
17

There is a module called 'time' which can help you. I know two ways:

  1. sleep

    Sleep (reference) asks the program to wait, and then to do the rest of the code.

    There are two ways to use sleep:

    import time # Import whole time module
    print("0.00 seconds")
    time.sleep(0.05) # 50 milliseconds... make sure you put time. if you import time!
    print("0.05 seconds")
    

    The second way doesn't import the whole module, but it just sleep.

    from time import sleep # Just the sleep function from module time
    print("0.00 sec")
    sleep(0.05) # Don't put time. this time, as it will be confused. You did
                # not import the whole module
    print("0.05 sec")
    
  2. Using time since boot using time.monotonic().

    This way is useful if you need a loop to be running. But this one is slightly more complex. time.monotonic is better than time.time as it does not account for leap seconds, but it counts the amount of settings from boot. (Credit: Mark Lakata)

    time_not_passed = True
    from time import monotonic as time # Importing time.monotonic but naming it 'time' for the sake of simplicity
    
    init_time = time() # Or time.monotonic() if whole module imported
    print("0.00 secs")
    while True: # Init loop
        if init_time + 0.05 <= time() and time_not_passed: # Time not passed variable is important as we want this to run once. !!! time.monotonic() if whole module imported :O
            print("0.05 secs")
            time_not_passed = False
    
Lucas Urban
  • 627
  • 4
  • 15
  • 4
    It is not recommended to use `time.time()` for measuring elapsed time. It is better to use `time.monotonic()` which is guaranteed to increase at a uniform rate. There are actual cases where `time()` can change by jumps, because of leap seconds and things. `time.monotonic()` has no absolute correlation to Linux epoch time, but it is usually started at 0 when the system boots up. – Mark Lakata Mar 03 '22 at 01:04
  • I can change time.time() to time.monotonic() – Lucas Urban Apr 03 '23 at 17:49
4

You can also do it by using the Timer() function.

Code:

from threading import Timer

def hello():
  print("Hello")

t = Timer(0.05, hello)
t.start()  # After 0.05 seconds, "Hello" will be printed
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Abu Noman Md Sakib
  • 322
  • 2
  • 5
  • 20
1

You can also use pyautogui as:

import pyautogui
pyautogui._autoPause(0.05, False)

If the first argument is not None, then it will pause for first argument's seconds, in this example: 0.05 seconds

If the first argument is None, and the second argument is True, then it will sleep for the global pause setting which is set with:

pyautogui.PAUSE = int

If you are wondering about the reason, see the source code:

def _autoPause(pause, _pause):
    """If `pause` is not `None`, then sleep for `pause` seconds.
    If `_pause` is `True`, then sleep for `PAUSE` seconds (the global pause setting).

    This function is called at the end of all of PyAutoGUI's mouse and keyboard functions. Normally, `_pause`
    is set to `True` to add a short sleep so that the user can engage the failsafe. By default, this sleep
    is as long as `PAUSE` settings. However, this can be override by setting `pause`, in which case the sleep
    is as long as `pause` seconds.
    """
    if pause is not None:
        time.sleep(pause)
    elif _pause:
        assert isinstance(PAUSE, int) or isinstance(PAUSE, float)
        time.sleep(PAUSE)
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
okie
  • 847
  • 6
  • 18