Python loop to run after n minutes from start time

We Are Going To Discuss About Python loop to run after n minutes from start time. So lets Start this Python Article.

Python loop to run after n minutes from start time

Advertisements
  1. How to solve Python loop to run after n minutes from start time

    Although schedule library has lots of capabilities, I think the following code will help you get what you want. you can simply change start_time, relativedelta and iteration_time
    import time import datetime start_time = datetime.datetime(year=2022, month=4, day=5, hour=1, minute=00, second=00) relativedelta = datetime.timedelta(hours=1) iteration_time = datetime.timedelta(minutes=5) end_time = start_time + relativedelta last_run = None def func(): print("this is python") while True: current_time = datetime.datetime.now() if start_time <= current_time <= end_time: if last_run: if current_time >= last_run + iteration_time: func() last_run = current_time else: last_run = current_time elif current_time > end_time: break time.sleep(1)
    this code prints (this is python) each 5 minutes (iteration_time) from 4/5/2022 1:00:00AM (start_time) for 1 hour (relativedelta)

  2. Python loop to run after n minutes from start time

    Although schedule library has lots of capabilities, I think the following code will help you get what you want. you can simply change start_time, relativedelta and iteration_time
    import time import datetime start_time = datetime.datetime(year=2022, month=4, day=5, hour=1, minute=00, second=00) relativedelta = datetime.timedelta(hours=1) iteration_time = datetime.timedelta(minutes=5) end_time = start_time + relativedelta last_run = None def func(): print("this is python") while True: current_time = datetime.datetime.now() if start_time <= current_time <= end_time: if last_run: if current_time >= last_run + iteration_time: func() last_run = current_time else: last_run = current_time elif current_time > end_time: break time.sleep(1)
    this code prints (this is python) each 5 minutes (iteration_time) from 4/5/2022 1:00:00AM (start_time) for 1 hour (relativedelta)

Solution 1

Advertisements

Although schedule library has lots of capabilities, I think the following code will help you get what you want. you can simply change start_time, relativedelta and iteration_time

import time
import datetime

start_time = datetime.datetime(year=2022, month=4, day=5, hour=1, minute=00, second=00)
relativedelta = datetime.timedelta(hours=1)
iteration_time = datetime.timedelta(minutes=5)

end_time = start_time + relativedelta
last_run = None


def func():
    print("this is python")


while True:
    current_time = datetime.datetime.now()
    if start_time <= current_time <= end_time:
        if last_run:
            if current_time >= last_run + iteration_time:
                func()
                last_run = current_time
        else:
            last_run = current_time
    elif current_time > end_time:
        break

    time.sleep(1)

this code prints (this is python) each 5 minutes (iteration_time) from 4/5/2022 1:00:00AM (start_time) for 1 hour (relativedelta)

Original Author Masoud Gheisari Of This Content

Solution 2

Advertisements

This can be achieved with a manual implementation.

Essentially, you would need to loop continuously until you reach the “active” time window. Once there, you basically execute your function and refuse to run again until the specified execution interval has passed. The main loop does not need to be executed as often as possible, but it is enough to run it once in a while as long as this is reasonably smaller than the execution interval. This effectively a way of limiting execution rate (throttling). Also, the execution time of the function func should be smaller than the interval, otherwise one or more executions are skipped.

import datetime
import time


def repeat_between(
        start_dt,
        stop_dt,
        interval_td,
        func,
        func_args=None,
        func_kws=None,
        collect_results=True,
        throttling_s=1):
    # ensure valid `func_args` and `func_kws`
    func_args = () if func_args is None else tuple(func_args)
    func_kws = {} if func_kws is None else dict(func_kws)
    # initialize current datetime and last run
    curr_dt = datetime.datetime.now()
    last_run = None
    # ensure the start datetime is:
    # - before the stop datetime
    # - after the current datetime
    if stop_dt < start_dt < curr_dt:
        return
    else:
        # collect results here
        result = []
    # wait until reaching the start datetime
    wait_td = (start_dt - curr_dt)
    time.sleep(wait_td.total_seconds())
    # loop until current datetime exceeds the stop datetime
    while curr_dt <= stop_dt:
        # if current time is
        # - past the start datetime
        # - near an interval timedelta
        if curr_dt >= start_dt and \
                (not last_run or curr_dt >= last_run + interval_td):
            curr_result = func(*func_args, **func_kws)
            if collect_results:
                result.append(curr.result)
            last_run = curr_dt
        # wait some time before checking again
        if throttling_s > 0:
            time.sleep(throttling_s)
        # update current time
        curr_dt = datetime.datetime.now()

To test this, one could use for example:

r = repeat_between(
    datetime.datetime.now() + datetime.timedelta(seconds=3),
    datetime.datetime.now() + datetime.timedelta(seconds=10),
    datetime.timedelta(seconds=2),
    func=lambda: (datetime.datetime.now(), 'Hello!'),
    throttling_s=0.1
)
print(r)
# [(datetime.datetime(2022, 4, 8, 15, 38, 21, 525347), 'Hello!'),
#  (datetime.datetime(2022, 4, 8, 15, 38, 23, 530025), 'Hello!'),
#  (datetime.datetime(2022, 4, 8, 15, 38, 25, 534628), 'Hello!'),
#  (datetime.datetime(2022, 4, 8, 15, 38, 27, 539120), 'Hello!')]

Original Author norok2 Of This Content

Solution 3

Advertisements

I believe this could be considered an object-oriented “canonical” solution which creates a Thread subclass instance that will call a specified function repeatedly every datetime.timedelta units until canceled. The starting and how long it’s left running are not details the class concerns itself with, and are left to the code making use of the class to determine.

Since most of the action occurs in a separate thread, the main thread could be doing other things concurrently, if desired.

import datetime
from threading import Thread, Event
import time
from typing import Callable


class TimedCalls(Thread):
    """Call function again every `interval` time duration after it's first run."""
    def __init__(self, func: Callable, interval: datetime.timedelta) -> None:
        super().__init__()
        self.func = func
        self.interval = interval
        self.stopped = Event()

    def cancel(self):
        self.stopped.set()

    def run(self):
        next_call = time.time()
        while not self.stopped.is_set():
            self.func()  # Target activity.
            next_call = next_call + self.interval
            # Block until beginning of next interval (unless canceled).
            self.stopped.wait(next_call - time.time())


def my_function():
    print(f"this is python: {time.strftime('%H:%M:%S', time.localtime())}")

# Start test a few secs from now.
start_time = datetime.datetime.now() + datetime.timedelta(seconds=5)
run_time = datetime.timedelta(minutes=2)  # How long to iterate function.
end_time = start_time + run_time

assert start_time > datetime.datetime.now(), 'Start time must be in future'

timed_calls = TimedCalls(my_function, 10)  # Thread to call function every 10 secs.

print(f'waiting until {start_time.strftime("%H:%M:%S")} to begin...')
wait_time = start_time - datetime.datetime.now()
time.sleep(wait_time.total_seconds())

print('starting')
timed_calls.start()  # Start thread.
while datetime.datetime.now() < end_time:
    time.sleep(1)  # Twiddle thumbs while waiting.
print('done')
timed_calls.cancel()

Sample run:

waiting until 11:58:30 to begin...
starting
this is python: 11:58:30
this is python: 11:58:40
this is python: 11:58:50
this is python: 11:59:00
this is python: 11:59:10
this is python: 11:59:20
this is python: 11:59:30
this is python: 11:59:40
this is python: 11:59:50
this is python: 12:00:00
this is python: 12:00:10
this is python: 12:00:20
done

Original Author martineau Of This Content

Solution 4

Advertisements

Did you try time.sleep(300)
where 300 is seconds.

Original Author Akhil Suthapalli Of This Content

Conclusion

So This is all About This Tutorial. Hope This Tutorial Helped You. Thank You.

Also Read,

ittutorial team

I am an Information Technology Engineer. I have Completed my MCA And I have 4 Year Plus Experience, I am a web developer with knowledge of multiple back-end platforms Like PHP, Node.js, Python and frontend JavaScript frameworks Like Angular, React, and Vue.

Leave a Comment