我有一个瓶子应用程序,我最终不想在 apache 上部署(仅供参考,以防这很重要)。现在我需要在瓶子应用程序启动后运行一次函数。我不能将它放入路由函数中,因为即使还没有用户访问该站点,它也必须运行。
有什么最好的做法吗?
该函数启动一个 APScheduler 实例并向其添加一个作业存储。
我有一个瓶子应用程序,我最终不想在 apache 上部署(仅供参考,以防这很重要)。现在我需要在瓶子应用程序启动后运行一次函数。我不能将它放入路由函数中,因为即使还没有用户访问该站点,它也必须运行。
有什么最好的做法吗?
该函数启动一个 APScheduler 实例并向其添加一个作业存储。
这就是我所做的。
def initialize():
//init whatever you need.
if __name__ == '__main__':
initialize()
@bottle.run(port='8080', yatta yatta)
老实说,您的问题只是同步与异步问题。使用 gevent 轻松转换为微线程,然后分别启动每个微线程。gevent.sleep
如果您想等待 Web 服务器完成启动, 您甚至可以在函数中或之前添加延迟。
import gevent
from gevent import monkey, signal, spawn, joinall
monkey.patch_all()
from gevent.pywsgi import WSGIServer
from bottle import Bottle, get, post, request, response, template, redirect, hook, abort
import bottle
@get('/')
def mainindex():
return "Hello World"
def apScheduler():
print "AFTER SERVER START"
if __name__ == "__main__":
botapp = bottle.app()
server = WSGIServer(("0.0.0.0", 80), botapp)
threads = []
threads.append(spawn(server.serve_forever))
threads.append(spawn(apScheduler))
joinall(threads)
创建一个 APScheduler类。
查看同一个站点中对象使用和创建的示例,因为它太笼统,无法给出一个具体的示例来复制。
我不知道这是否有帮助。
class Shed(object):
def __init__(self): # this to start it
# instruccions here
def Newshed(self, data):
# Call from bottle
# more methods ...
...
# init
aps = Shed() # this activates Shed.__init__()
...
# in the @router
x = aps.Newshed(data) # or whatever
无论如何,我仍在学习这些东西,这只是一个想法。
import threading
import bottle
def init_app():
def my_function_on_startup():
# some code here
pass
app = bottle.app()
t = threading.Thread(target=my_function_on_startup)
t.daemon = True
t.start()
return app
app = init_app()
@app.route("/")
def hello():
return "App is running"
if __name__ == "__main__":
bottle.run(app, host='localhost', port=8080, debug=True)