如何同时使用“时间表”和“运行”

问题描述

我有一个计划脚本,用于运行以下任务:

schedule.every(3).seconds.do(jobCheckSmth)

while True:
    schedule.run_pending()
    time.sleep(1)

我想使用Web界面来检查其状态,而不是使用CLI上的print()

run(host='localhost',port=80,debug=True)

但是它阻止了代码执行,因此我必须按Ctrl-C来中断 webserver 循环才能继续运行 循环

Bottle v0.12.18 server starting up (using WsgiRefServer())...
Listening on http://localhost:80/ Hit Ctrl-C to quit.

解决方法

这是一个使用gevent将瓶子变成异步的示例,对我来说非常有效。就是这样,或者您必须在Bottle应用程序之外的自己线程中运行schedule。但老实说,您应该这样做。

import gevent
from gevent import monkey,spawn as gspawn,sleep as gsleep,socket,signal_handler as sig
monkey.patch_all()
import signal
import arrow
from bottle import Bottle,static_file,get,post,request,response,template,redirect,hook,route,abort
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler

def start():
    def start_thread():
        set()
        while 1:
            try:
                schedule.run_pending()
            except:
                logger.exception('Scheduler Exception')
            gsleep(5) # This is the polling cycle for pending jobs
    print('Scheduler Started...')
    gspawn(start_thread)

def sample():
    gspawn(jobCheckSmth)

def set():
    # schedule.every(180).seconds.do(func)
    schedule.every().day.at("00:00").do(sample)
    logger.info('Started Schedule at {}'.format(arrow.now()))

@get('/')
def app():
    return 'Hello World!'

 if __name__ == '__main__':
    scheduler.start()
    botapp = bottle.app()
    server = WSGIServer(("0.0.0.0",int(port)),botapp,handler_class=WebSocketHandler)
    def shutdown():
        print('Shutting down ...')
        server.stop(timeout=60)
        exit(signal.SIGTERM)
    sig(signal.SIGTERM,shutdown)
    sig(signal.SIGINT,shutdown)
    server.serve_forever()