user12218428
user12218428

Reputation:

Change the Scheduling Time - Python

I am using schedule module to automatically run a function...

I am thinking of changing the scheduling time dynamically, but the solution is not success

Code -

import schedule
import pandas
from time import gmtime, strftime, sleep
import time
import random

time = 0.1
def a():
    global time
    print(strftime("%Y-%m-%d %H:%M:%S", gmtime()))
    index = random.randint(1, 9)
    print(index, time)
    if(index==2):
        time = 1

print(strftime("%Y-%m-%d %H:%M:%S", gmtime()))
schedule.every(time).minutes.do(a) #specify the minutes to automatically run the api

while True:
    schedule.run_pending()

In this program, I scheduled the program to run every 6 seconds. And if the random integer - index value becomes 2, then the time variable is assigned as 1(1 minute). I checked, the time variable is changed to 1 after the random integer index becomes 2. The issue - After changing the time variable to 1, the scheduling still runs the function a() every 6 seconds not 1 minute.

How to change the scheduling time dynamically?

Thank you

Upvotes: 1

Views: 1869

Answers (2)

Tanveer
Tanveer

Reputation: 99

I usually use custom schedulers, as they allow greater control and are also less memory intensive. The variable "time" needs to be shared between processes. This is where Manager().Namespace() comes to rescue. It talks 'between' processes.

import time
import random
from multiprocessing import Process, Manager

ns = Manager().Namespace()
ns.time = 0.1
processes = []

def a():
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))
    index = random.randint(1, 4)
    if(index==2):
        ns.time = 1
    print(index, ns.time)

while True:
    try:
        s = time.time() + ns.time*60
        for x in processes:
            if not x.is_alive():
                x.join()
                processes.remove(x)
        print('Sleeping :',round(s - time.time()))
        time.sleep(round(s - time.time()))
        p = Process(target = a)
        p.start()
        processes.append(p)
    except:
        print('Killing all to prevent orphaning ...')
        [p.terminate() for p in processes]
        [processes.remove(p) for p in processes]
        break

Upvotes: 0

Ghanteyyy
Ghanteyyy

Reputation: 494

After changing the time variable to 1, the scheduling still runs the function a() every 6 seconds not 1 minute.

This is because schedule.every(time).minutes.do(a) # specify the minutes to automatically run the api sets time to 6 seconds at beginning which does not change even if you change the value of that variable because that line has executed just once where value of time was 6 seconds at that execution.

How to change the scheduling time dynamically?

After reading DOCUMENTATION, I found nothing(I think) regarding changing time manually(when certain condition becomes satisfies) but it has built in Random Interval function where that function itself specifies random time within the range.

In your case you could do:

schedule.every(5).to(10).seconds.do(a)

The problem is that you cannot change time when certain condition satisfies.

Maybe there might be some way to fix that issue but could not figure out. And these information may help to investigate further to solve your problem.

Upvotes: 1

Related Questions