Запустить функцию один раз при запуске Bottle.py

У меня есть бутылочное приложение, которое я в конечном итоге не хочу развертывать на apache (просто к вашему сведению, если это важно). Теперь мне нужно запустить функцию один раз после запуска приложения бутылки. Я не могу просто поместить его в маршрутизируемую функцию, потому что она должна работать, даже если ни один пользователь еще не заходил на сайт.

Любая лучшая практика для этого?

Функция запускает экземпляр APScheduler и добавляет к нему хранилище заданий.


person pypat    schedule 21.01.2013    source источник


Ответы (3)


Вот что я делаю.

def initialize():
    //init whatever you need.
if __name__ == '__main__':
    initialize()
    @bottle.run(port='8080', yatta yatta)
person Tadgh    schedule 19.05.2013
comment
Это работает, только если вы используете встроенный сервер. Иначе не запустится. - person Jonathon Reinhart; 23.04.2015

Честно говоря, ваша проблема - это просто проблема синхронизации и асинхронности. Используйте gevent, чтобы легко конвертировать в микропотоки, а затем запускайте каждый по отдельности. Вы даже можете добавить задержку либо в своей функции, либо раньше с помощью 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)
person eatmeimadanish    schedule 04.09.2019

Создайте класс 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

Во всяком случае, я все еще изучаю этот материал, и это просто идея.

person f p    schedule 21.01.2013
comment
На самом деле это скрипт на Python, который не дисквалифицировал бы ваш подход, но этот скрипт взаимодействует с самим приложением для бутылок. Дело в том, что функции, которые мне нужно запланировать, также являются частью приложения для бутылок, поэтому я не могу запустить планировщик, изолированный от этого приложения. - person pypat; 21.01.2013
comment
Создайте класс, который вы инициализируете при запуске, а затем используете при необходимости. - person f p; 21.01.2013
comment
Я очень ценю ваши усилия, но это мне совсем не помогает. Я знаком со всеми этими классами и элементами инициализации, но мне все еще нужно знать, как вызывать что-либо (инициировать что-либо или просто вызывать функцию) ПОСЛЕ метода запуска бутылки, не помещая его в маршрутизируемую функцию. Это должно быть в этом порядке, потому что функции, которые я не хочу планировать, не определены до запуска сервера (не знаю, почему это на самом деле) - person pypat; 22.01.2013