APScheduler 无法停止
我正在开发一个网站的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时,程序就会停止运行。