APScheduler回调函数-作业完成后,如何调用python中的函数/模块?

APScheduler回调函数-作业完成后,如何调用python中的函数/模块?,python,python-2.7,callback,apscheduler,Python,Python 2.7,Callback,Apscheduler,您好,我正在Django项目中使用APScheduler。工作完成后,我如何计划在python中调用函数?回调函数 我将作业存储为数据库中的Django模型。当它完成时,我想在表中将其标记为completed=1。最简单和通用的方法是将回调函数添加到计划作业的末尾。您还可以在scheduler类的基础上构建,以便在任务结束时包含self.function_callback() 快速示例: def tick(): print('Tick! The time is: %s' % dateti

您好,我正在Django项目中使用APScheduler。工作完成后,我如何计划在python中调用函数?回调函数


我将作业存储为数据库中的Django模型。当它完成时,我想在表中将其标记为
completed=1

最简单和通用的方法是将回调函数添加到计划作业的末尾。您还可以在scheduler类的基础上构建,以便在任务结束时包含self.function_callback()

快速示例:

def tick():
    print('Tick! The time is: %s' % datetime.now())
    time.sleep(10)
    function_cb()

def function_cb():
    print "CallBack Function"
    #Do Something

if __name__ == '__main__':
    scheduler = AsyncIOScheduler()
    scheduler.add_job(tick, 'interval', seconds=2)
    scheduler.start()
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))
    # Execution will block here until Ctrl+C (Ctrl+Break on Windows) is pressed.
    try:
        asyncio.get_event_loop().run_forever()
    except (KeyboardInterrupt, SystemExit):
        pass
        scheduler.shutdown(wait=False)

最简单和通用的方法是将回调函数添加到计划作业的末尾。您还可以在scheduler类的基础上构建,以便在任务结束时包含self.function_callback()

快速示例:

def tick():
    print('Tick! The time is: %s' % datetime.now())
    time.sleep(10)
    function_cb()

def function_cb():
    print "CallBack Function"
    #Do Something

if __name__ == '__main__':
    scheduler = AsyncIOScheduler()
    scheduler.add_job(tick, 'interval', seconds=2)
    scheduler.start()
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))
    # Execution will block here until Ctrl+C (Ctrl+Break on Windows) is pressed.
    try:
        asyncio.get_event_loop().run_forever()
    except (KeyboardInterrupt, SystemExit):
        pass
        scheduler.shutdown(wait=False)
允许挂接各种APScheduler。我已使用提交的事件\作业\成功获取作业的下一个运行时

(更新) 我确认了它是否能够钩住这些事件

from datetime import datetime
import os
from logging import getLogger, StreamHandler, Filter, basicConfig, INFO

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR


logger = getLogger(__name__)
logger.setLevel(INFO)


def tick():
    now = datetime.now()
    logger.info('Tick! The time is: %s' % now)
    if now.second % 2 == 0:
        raise Exception('now.second % 2 == 0')


if __name__ == '__main__':
    sh = StreamHandler()
    sh.addFilter(Filter('__main__'))
    basicConfig(
            handlers = [sh],
            format='[%(asctime)s] %(name)s %(levelname)s: %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
    )

    def my_listener(event):
        if event.exception:
            logger.info('The job crashed')
        else:
            logger.info('The job worked')

    scheduler = BlockingScheduler()
    scheduler.add_job(tick, 'interval', seconds=3)
    scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass
执行此代码时,输出如下所示:

Interrupt: Press ENTER or type command to continue
Press Ctrl+C to exit
[2019-11-30 09:24:12] __main__ INFO: Tick! The time is: 2019-11-30 09:24:12.663142
[2019-11-30 09:24:12] __main__ INFO: The job crashed
[2019-11-30 09:24:15] __main__ INFO: Tick! The time is: 2019-11-30 09:24:15.665845
[2019-11-30 09:24:15] __main__ INFO: The job worked
[2019-11-30 09:24:18] __main__ INFO: Tick! The time is: 2019-11-30 09:24:18.663215
[2019-11-30 09:24:18] __main__ INFO: The job crashed
允许挂接各种APScheduler。我已使用提交的事件\作业\成功获取作业的下一个运行时

(更新) 我确认了它是否能够钩住这些事件

from datetime import datetime
import os
from logging import getLogger, StreamHandler, Filter, basicConfig, INFO

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR


logger = getLogger(__name__)
logger.setLevel(INFO)


def tick():
    now = datetime.now()
    logger.info('Tick! The time is: %s' % now)
    if now.second % 2 == 0:
        raise Exception('now.second % 2 == 0')


if __name__ == '__main__':
    sh = StreamHandler()
    sh.addFilter(Filter('__main__'))
    basicConfig(
            handlers = [sh],
            format='[%(asctime)s] %(name)s %(levelname)s: %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
    )

    def my_listener(event):
        if event.exception:
            logger.info('The job crashed')
        else:
            logger.info('The job worked')

    scheduler = BlockingScheduler()
    scheduler.add_job(tick, 'interval', seconds=3)
    scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass
执行此代码时,输出如下所示:

Interrupt: Press ENTER or type command to continue
Press Ctrl+C to exit
[2019-11-30 09:24:12] __main__ INFO: Tick! The time is: 2019-11-30 09:24:12.663142
[2019-11-30 09:24:12] __main__ INFO: The job crashed
[2019-11-30 09:24:15] __main__ INFO: Tick! The time is: 2019-11-30 09:24:15.665845
[2019-11-30 09:24:15] __main__ INFO: The job worked
[2019-11-30 09:24:18] __main__ INFO: Tick! The time is: 2019-11-30 09:24:18.663215
[2019-11-30 09:24:18] __main__ INFO: The job crashed

是的,我同意。我在gitter频道询问了作者,发现这在APScheduler中是不可能的。您所说的是合法的,但我的用例不同,因为启动过程需要一些时间,所以我不能确保在调度程序启动作业时将其标记为完成。我唯一能想到的是添加另一个独立的作业来标记完整状态,但是(1)它不能保证什么,(2)它很难看:一件事两个作业。所以最后我放弃了,只是不要做标记。谢谢,标记为已接受。是的,我同意。我在gitter频道询问了作者,发现这在APScheduler中是不可能的。您所说的是合法的,但我的用例不同,因为启动过程需要一些时间,所以我不能确保在调度程序启动作业时将其标记为完成。我唯一能想到的是添加另一个独立的作业来标记完整状态,但是(1)它不能保证什么,(2)它很难看:一件事两个作业。所以最后我放弃了,只是不要做标记。谢谢,标记为已接受。是的,您知道它何时提交给调度程序,但您没有作业完成挂钩;一旦作业启动,您就没有回调来知道它是否完成了;正如我现在所想,它超出了范围。EVENT_JOB_EXECUTED表示“作业已成功执行”。事件\u作业\u错误显示“作业在执行期间引发异常”。有可能吗?是的,你知道它什么时候被提交给调度程序,但是你没有一个任务完成的挂钩;一旦作业启动,您就没有回调来知道它是否完成了;正如我现在所想,它超出了范围。EVENT_JOB_EXECUTED表示“作业已成功执行”。事件\u作业\u错误显示“作业在执行期间引发异常”。这有可能吗?