dbader / schedule

Python job scheduling for humans.
https://schedule.readthedocs.io/
MIT License
11.71k stars 960 forks source link

How to handle jobs that return values? #547

Open saketvora opened 1 year ago

saketvora commented 1 year ago

Sorry in advance if this is already documented somewhere, can't find it yet.

I have functions that return values, and I'm struggling to see how to factor that into the way you schedule and run jobs with this library. Example, a function called getData() that does a API get request, and returns a variable called data Then a function called processData(data) that takes the data and does something with it.

In my example, I'd like to only run getData() once every 48 hours, but I need to run processData(data) every hour. (The reason for this is that the data feed via API doesn't refresh very often, so I don't need to call it every hour).

I see the syntax for defining the scheduling parameters be:

schedule.every(48).hours.do(getData)
schedule.every(1).hours.do(processData)

but how do I handle the data variable returned by getData()

All the examples I've found so far with schedule are jobs that don't return values. If I need my jobs to share data with each other, maybe I need to use global variables?

Any help much appreciated, thanks.

gabrielcipriano commented 1 year ago

One way to get around of this is the function access the outer scope (such as the global scope)

getData could access a variable to update it's value, and processData could do the same to read this value. With a 'wrapper' of any kind (a dict, list or class), you can do this with less chance of messing with references.

See an example:

import schedule

class Wrapper:
    value = None

data = Wrapper()

def getData():
    print("Getting new data...")
    data.value = 'the new data'

def processData():
    print("I'm processing... current value:")
    print(data.value)

schedule.every(8).seconds.do(getData)
schedule.every(5).seconds.do(processData)
catchthemonster commented 5 months ago

yup, this type of wrapper worked for me and it is a good thing to have. I have significantly more complex scenario with, rpc, statemachine, scheduler, and multi processing but at the end I got result of operation finally back to caller ...

thanks for the hint ...