Search code examples
pythonscheduled-tasksschedule

Schedule at given time meanwhile a function runs - Python


I have been searching for different schedule in Python such as Sched (Im a Windows user) etc. However I can't really get a grip on it and I don't know if it is possible. My plan is to make like the picture below:

My own UML

We can see at Time:00.21 is etc the time I want the program to do the function 2 BUT the function 1 should be add into a list I have made as many as possible in the list as it works in 2 minutes before the timer hits. Basically...

The function 1 is doing its function 2 minutes before the timer. When it hits 00:21 then stop the function 1 and do the function 2 where it takes the List and uses it in its own function and when its done then its done.

However I don't know how to do this or to start. I was thinking to do a own timer but it feels like that is not the solution. What do you guys suggest?


Solution

  • I think I would approach a problem like this by creating a class that subclasses threading.Thread. From there, you override the run method with the function that you want to perform, which in this case will put stuff in a list. Then, in main, you start that thread followed by a call to sleep. The class would look like this:

    class ListBuilder(threading.Thread):
        def__init__(self):
            super().__init__()
            self._finished = False
    
            self.lst = []
    
        def get_data():
            # This is the data retrieval function
            # It could be imported in, defined outside the class, or made static.
    
        def run(self):
            while not self._finished:
                self.lst.append(self.get_data())
    
        def stop(self):
            self._finished = True
    

    Your main would then look something like

    import time
    
    if __name__ == '__main__':
        lb = ListBuilder()
        lb.start()
    
        time.sleep(120)  # sleep for 120 seconds, 2 minutes
    
        lb.stop()
        time.sleep(.1)  # A time buffer to make sure the final while loop finishes
                        # Depending on how long each while loop iteration takes,
                        # it may not be necessary or it may need to be longer
    
        do_stuf(lb.lst)  # performs actions on the resulting list
    

    Now, all you have to do is use the Windows Task Scheduler to run it at 00:19 and you should be set.