问题描述
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()