APScheduler 无法停止

1 投票
2 回答
8306 浏览
提问于 2025-04-18 11:48

我正在开发一个网站的Python代码,这段代码的功能之一是创建一个Excel表格,然后把它转换成一个JSON文件。我希望这段代码能够持续运行,直到网站管理员把它终止。

为此,我使用了APscheduler这个工具。

在没有使用APscheduler的时候,代码运行得很好,但当我尝试添加其他代码时,会出现两种情况:1)代码一直运行,不管我按“ctrl+C”都无法停止,只能通过任务管理器强制结束;2)代码只运行一次,然后就停止了。

不会停止的代码:

from apscheduler.scheduler import Scheduler
import logging
import time

logging.basicConfig()
sched = Scheduler()
sched.start()

(...)
code to make excel sheet and json file
(...)

@sched.interval_schedule(seconds = 15)
def job():
    excelapi_final()

while True:
    time.sleep(10)
sched.shutdown(wait=False)

运行一次就停止的代码:

from apscheduler.scheduler import Scheduler
import logging
import time

logging.basicConfig()
sched = Scheduler()

(...)
#create excel sheet and json file
(...)

@sched.interval_schedule(seconds = 15)
def job():
    excelapi_final()
sched.start()

while True:
    time.sleep(10)
    sched.shutdown(wait=False)

根据我从其他问题、一些教程和文档中了解到的,sched.shutdown应该可以让代码通过ctrl+C被终止,但这并没有奏效。有没有什么建议?谢谢!

2 个回答

1

你可以优雅地关闭它:

import signal
from apscheduler.scheduler import Scheduler
import logging
import time

logging.basicConfig()
sched = Scheduler()

(...)
#create excel sheet and json file
(...)

@sched.interval_schedule(seconds = 15)
def job():
    excelapi_final()

sched.start()

def gracefully_exit(signum, frame):
    print('Stopping...')
    sched.shutdown()

signal.signal(signal.SIGINT, gracefully_exit)
signal.signal(signal.SIGTERM, gracefully_exit)
3

你可以使用独立模式:

sched = Scheduler(standalone=True)

然后像这样启动调度器:

try:
    sched.start()
except (KeyboardInterrupt):
    logger.debug('Got SIGTERM! Terminating...')

你修改后的代码应该是这样的:

from apscheduler.scheduler import Scheduler
import logging
import time

logging.basicConfig()
sched = Scheduler(standalone=True)

(...)
code to make excel sheet and json file
(...)

@sched.interval_schedule(seconds = 15)
def job():
    excelapi_final()

try:
    sched.start()
except (KeyboardInterrupt):
    logger.debug('Got SIGTERM! Terminating...')

这样当你按下Ctrl-C时,程序就会停止运行。

撰写回答