gpt4 book ai didi

python - 如何在 apscheduler 作业中从类中调用函数?

转载 作者:行者123 更新时间:2023-12-05 05:48:12 24 4
gpt4 key购买 nike

我有一个包含触发器的,我想在作业命中适当的时候更新这些触发器。

我的类(class):

class SetTrigger(object):
def __init__(self):
self.set_work = False
self.set_reload = False
self.set_refresh = False

def UpdateSetRefresh(self):
self.set_refresh = True
return self.set_refresh

def UpdateSetWork(self):
self.set_work = True
return self.set_work

def UpdateSetReload(self):
self.set_reload = True
return self.set_reload

如果我将变量设置为从函数中获取值,如下所示,我会收到一个错误。

trigger = SetTrigger()
set_refresh = trigger.UpdateSetRefresh()

错误:

func must be a callable or a textual reference to one

我已经尝试调用 trigger.UpdateSetRefresh,但变量 set_refresh 没有更改为 True。如果我调用 trigger.UpdateSetRefresh(),它会给出与上面相同的错误。

如何在 APScheduler 作业中调用类 SetTrigger 中的函数 UpdateSetRefresh,如下所示?

我试过:

scheduler.add_job(trigger.UpdateSetRefresh, 'interval', seconds=20, id='1', name='refresh_hereoes_positions', misfire_grace_time=180)

[编辑]

trigger.UpdateSetRefresh 未按我的需要返回 True 的示例:

import tzlocal
import time
import os
from bot import SetTrigger
from apscheduler.schedulers.asyncio import AsyncIOScheduler

trigger = SetTrigger()

scheduler = AsyncIOScheduler(timezone=str(tzlocal.get_localzone()))
scheduler.add_job(trigger.UpdateSetRefresh, 'interval', seconds=3)
scheduler.start()
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

try:
# This is here to simulate application activity (which keeps the main thread alive).
while True:
time.sleep(2)
print(trigger.set_refresh)
except (KeyboardInterrupt, SystemExit):
# Not strictly necessary if daemonic mode is enabled but should be done if possible
scheduler.shutdown()

输出:

Press Ctrl+Break to exit
False
False
False

最佳答案

您必须将函数传递给 add_job 但您传递的不是它而是 trigger.UpdateSetRefresh 的返回值。
所以正确的陈述应该是这样的:

scheduler.add_job(trigger.UpdateSetRefresh, 'interval', seconds=2, id='1', name='refresh_hereoes_positions')

代替

scheduler.add_job(trigger.UpdateSetRefresh(), 'interval', seconds=2, id='1', name='refresh_hereoes_positions')

当你在函数名末尾添加括号时,python 将执行它并将返回值传递给 add_job 函数。
有关将函数作为参数传递的更多信息,请查看此 link .

[编辑]
如果您使用的是 AsyncIOScheduler你应该做这样的事情

import tzlocal
import os
from bot import SetTrigger
from apscheduler.schedulers.asyncio import AsyncIOScheduler
import asyncio


def DisplayValue(trigger):
print(trigger.UpdateSetWork())


trigger = SetTrigger()
scheduler = AsyncIOScheduler(timezone=str(tzlocal.get_localzone()))
scheduler.add_job(trigger.UpdateSetRefresh, 'interval', seconds=3)
scheduler.start()
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))


try:
loop = asyncio.get_event_loop()
loop.call_at(10, displayValue, trigger)
loop.run_forever()
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()

或者你可以像那样使用后台调度程序

from apscheduler.schedulers.background import BackgroundScheduler
from bot import SetTrigger
import tzlocal
import time

trigger = SetTrigger()
scheduler = BackgroundScheduler()
scheduler.configure(timezone=str(tzlocal.get_localzone()))
scheduler.add_job(trigger.UpdateSetRefresh, 'interval', seconds=2, id='1', name='refresh_hereoes_positions')
scheduler.start()

while True:
print(trigger.set_refresh)
time.sleep(2)

关于python - 如何在 apscheduler 作业中从类中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70854381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com