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
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
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)
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.
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
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
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)
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.