在bottle.py启动时运行一次函数

时间:2013-01-21 15:27:32

标签: python scheduling bottle

我有一个瓶子应用程序,我最终不会在apache上部署(只有fyi,如果这很重要)。 现在我需要在启动瓶子应用程序后运行一次函数。我不能把它放到路由功能中,因为即使没有用户访问过网站也必须运行它。

最好的做法是什么?

该函数启动一个APScheduler实例并向其添加一个jobstore。

4 个答案:

答案 0 :(得分:1)

老实说,您的问题仅仅是同步与异步问题。使用gevent轻松转换为微线程,然后分别启动每个线程。如果要等待Web服务器完成启动,甚至可以在功能中或之前使用gevent.sleep添加一个延迟。

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)

答案 1 :(得分:0)

创建一个APScheduler class

查看同一站点中对象使用和创建的示例,因为它太笼统而无法提供复制的特定示例。

我不知道this是否有帮助。

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

无论如何,我还在学习这些东西,这只是一个想法。

答案 2 :(得分:0)

这就是我的工作。

def initialize():
    //init whatever you need.
if __name__ == '__main__':
    initialize()
    @bottle.run(port='8080', yatta yatta)

答案 3 :(得分:0)

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)