execute a function every minutes for 1 hour

Question:

I am trying to execute a function every 1 minute and end the function once reaches one hour. My function will print the current time stamp every 1 minutes untill 1 hour from when i started.

My function:

import datetime
def funcprint():
    ct = datetime.datetime.now()
    print("After 1 minute:-", ct)
    return 

Loop funtion I tried: Confused on how to provide the interval of 1 minute and execute function

import time
delay = 60*60 # For 1 hour
close_time = time.time()+delay
while True:
    if time.time() > close_time:
        break
    else:
        funcprint() #Not sure how to interval and print for every minute
Asked By: adss4

||

Answers:

Code:

delay = 60  # 1 minute in seconds
close_time = time.time() + 60 * 60  # 1 hour later

while time.time() < close_time:  # close after 1 hour later
    funcprint()
    time.sleep(delay)  # wait in 1 minute interval 

EDIT:

If the function takes more time (e.g. 2-3 secs), calculate the remaining time.

Code:

interval = 60  # 1 minute in seconds
close_time = time.time() + 60 * 60  # 1 hour later

while time.time() < close_time: # close after 1 hour later
    start_time = time.time()
    funcprint()
    elapsed_time = time.time() - start_time

    remaining_time = max(0, interval - elapsed_time) # dynamically adjusting according to execution time
    time.sleep(remaining_time)

Output:

After 1 minute:- 2023-11-22 16:21:32.761715
After 1 minute:- 2023-11-22 16:22:32.777379
After 1 minute:- 2023-11-22 16:23:32.799795
After 1 minute:- 2023-11-22 16:24:32.807039
After 1 minute:- 2023-11-22 16:25:32.815058
After 1 minute:- 2023-11-22 16:26:32.830860
After 1 minute:- 2023-11-22 16:27:32.840978

EDIT2:

To avoid drift in milliseconds, start_time carried out of the loop:

Code:

interval = 60  # 1 minute in seconds
close_time = time.time() + 60 * 60  # 1 hour later

next_start_time = time.time()     # to avoid drift in seconds

while time.time() < close_time: # close after 1 hour later
    funcprint()

    next_start_time += interval
    remaining_time = max(0, next_start_time - time.time()) # dynamically adjusting according to execution time

    time.sleep(remaining_time)

Output (running multiple times to view milliseconds drift, more stable than previous one):

After 1 minute:- 2023-11-22 16:18:31.405631
After 1 minute:- 2023-11-22 16:19:31.408488
After 1 minute:- 2023-11-22 16:21:31.415470
After 1 minute:- 2023-11-22 16:22:31.409010
After 1 minute:- 2023-11-22 16:23:31.411131
After 1 minute:- 2023-11-22 16:24:31.414009
After 1 minute:- 2023-11-22 16:25:31.415057
Answered By: Ömer Sezer

This is another variant solution.
Solution use builtin library datetime and they class timedelta to calculate hours and minutes.
This variant more readble.

    import time
    from datetime import datetime, timedelta
    next_start = datetime.now() + timedelta(minutes=1)
    stop = datetime.now() + timedelta(hours=1)

    while datetime.now() < stop:
        print('every 5 second check')
        if datetime.now() > next_start:
            print('start func every 1 minute')
            next_start = datetime.now() + timedelta(minutes=1)
        time.sleep(5)

more simple

    import time
    from datetime import datetime, timedelta

    stop = datetime.now() + timedelta(hours=1)

    while datetime.now() < stop:
        print('start func every 1 minute')
        time.sleep(60)
Answered By: binarymind

It looks like you’re interested in executing a function every minute for an hour and handling potential drift in execution time.

Here’s an updated code:

import time
import datetime

def funcprint():
    ct = datetime.datetime.now()
    print("After 1 minute:", ct)
    return

interval = 60  # 1 minute in seconds
close_time = time.time() + 60 * 60  # 1 hour later
next_start_time = time.time()

while time.time() < close_time:  # close after 1 hour later
    funcprint()

    next_start_time += interval
    remaining_time = max(0, next_start_time - time.time())  

    time.sleep(remaining_time)

print("Execution completed after 1 hour.")

Output:

After 1 minute: 2023-12-18 18:28:32.872504
After 1 minute: 2023-12-18 18:29:32.874971
After 1 minute: 2023-12-18 18:30:32.876673
After 1 minute: 2023-12-18 18:31:32.878479
After 1 minute: 2023-12-18 18:32:32.880180
After 1 minute: 2023-12-18 18:33:32.881838
...
Execution completed after 1 hour.
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.