Передача объекта в Apscheduler в качестве аргумента для функции - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь передать объект в качестве аргумента функции задания с помощью apscheduler. Это нормально, но в моем случае я бы хотел изменить одно из его значений и использовать обновленное значение при запуске задания. Вот мой пример кода

import time
import sqlalchemy
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore


class MyClass:
    def __init__(self, *args, **kwargs):
        self.state = kwargs.get('state', "")


jobstores = {
    'default': SQLAlchemyJobStore(url='sqlite:///sched.db', tablename='apscheduler_jobs')
}

scheduler = BackgroundScheduler()
scheduler.configure(timezone='Europe/Paris')
scheduler.add_jobstore(jobstores['default'], 'default')


def myFunction(_internals):
    print("- in job")
    print(_internals.__dict__)
    print(".")


if __name__ == "__main__":
    scheduler.start()
    myInstance = MyClass(state="off")
    print(myInstance.__dict__)
    j1 = scheduler.add_job(myFunction, trigger='cron', args=[myInstance],  second='*/10', max_instances=10, jobstore='default', srv_id="blablabla-x6548710")
    try:
        # This is here to simulate application activity (which keeps the main thread alive).
        while True:
            time.sleep(2)
            myInstance.__setattr__("state", "running")
            print(myInstance.__dict__)
    except (KeyboardInterrupt, SystemExit):
        print('exit')
        scheduler.shutdown()

Вот что я ожидаю:

{'state': 'running'}
{'state': 'running'}
{'state': 'running'}
{'state': 'running'}
{'state': 'running'}
in job
{'state': 'running'}
.
{'state': 'running'}

Но вместо этого у меня есть:

{'state': 'running'}
{'state': 'running'}
{'state': 'running'}
{'state': 'running'}
{'state': 'running'}
in job
{'state': 'off'}
.
{'state': 'running'}

Есть ли способ получить то же самое значение в то время как l oop и работа в то время, когда это срабатывает?

Спасибо, мальчики и девочки

1 Ответ

0 голосов
/ 28 февраля 2020

Оказалось, что myInstance в задании был совершенно другим объектом. Таким образом, это не было затронуто никакими изменениями, сделанными в l oop. Я использовал другую стратегию: использование memcached для связи между l oop и запланированным заданием. Все еще открыты для любых других предложений.

...