DiabloXerox
DiabloXerox

Reputation: 123

how to get the output of the function used in Timer

I am running a flask application which shall call a function getSomething(input) every day at the same time. This function returns a string. I can not return a print() because I need to pass the string to another function.

When using the Timer function t = Timer(secs, getSomething, args=[input]) I do not know how to aces the return value of the getSomething function.

example:

from datetime import datetime, timedelta
from threading import Timer

# This shall trigger something at a certain time^
x = datetime.today()
y = x + timedelta(seconds=5)
delta_t = y - x
secs = delta_t.seconds + 1

def getSomething(a):
   b = a + " Hello World"
   return b

s = "Test"
t = Timer(secs, getSomething, args=[s])
t.start()

I know the very same question has been asked here before. But I am not able to adapt it to my problem though I think i can not avoid the return.

Upvotes: 2

Views: 103

Answers (1)

Artiom  Kozyrev
Artiom Kozyrev

Reputation: 3836

The problem can be solved the following way:

from datetime import datetime, timedelta
from threading import Timer

d = [] # use list, dictionary, some class or queue.Queue to store data


def getSomething(a):
    global d
    d.append(a + " Hello World")


if __name__ == "__main__":
    # This shall trigger something at a certain time^
    x = datetime.today()
    y = x + timedelta(seconds=5)
    delta_t = y - x
    secs = delta_t.seconds + 1
    s = "Test"
    t = Timer(secs, getSomething, args=[s])
    t.start()
    t.join()  # need to wait until thread is finished to get new d value
    print(d[0])

Another exmple how you can get data from another thread:

from threading import Thread
import time


class Storage:
    def __init__(self):
        self.storage = ""


class MyThread(Thread):
    def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None):
        super().__init__(group=group, target=target, name=name, daemon=daemon)
        self.args = args
        self.kwargs = kwargs

    def run(self):
        self.args[0].storage += "Hello!"


if __name__ == "__main__":
    s = Storage()
    branch = MyThread(args=(s,),)
    branch.start()
    time.sleep(1)  # need some time to wait for another thread
    print(s.storage)

Upvotes: 1

Related Questions