2016-06-10 3 views
0

Ich bin gerade mit einem Remote-Mongodb verbunden, um ein Dashboard in Flask zu generieren. Die db-Verbindung und das Laden in Pandas erfolgt bei jeder Seitenanforderung.Erstellen einer Hintergrundaufgabe zum Abrufen von PyMongo DB in Flask für Analytics

@app.route("/") 

    #connects to db 
    #loads to pandas 
    #perform analysis and display 

@app.route("/recent/") 

    #connects to db 
    #loads to pandas 
    #perform analysis and display 

Das Laden der gesamten Datenmenge in Pandas für jede Seitenanforderung ist eindeutig ineffizient. Die geladenen Daten ändern sich nicht häufig (vielleicht alle 10 Minuten oder so).

Was ist die effizienteste Methode/Best Practice in dieser Situation. Ist es möglich, eine globale Funktion zu definieren, die das Dataset alle x Minuten aktualisiert, wobei lokale Funktionen die Analyse des globalen Datasets bei jeder Seitenanforderung durchführen?

Danke.

Antwort

2

Eine Möglichkeit, Hintergrundaufgaben zu erstellen, ist Sellerie. Sellerie nur pip install celery (in einem virtualenv ist ideal wie üblich) zu installieren. Here ist komplettes Tutorial für die Grundlagen. Here ist das Repo für das Projekt Miguel baut in seinem Blogpost.

from flask import Flask 
from celery import Celery 

app = Flask(__name__) 
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0' 
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0' 

celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL']) 
celery.conf.update(app.config) 

Offensichtlich nur eine einfache App-Instanz, konfiguriert für die Verwendung mit Sellerie: Für die Nachwelt werde ich einige der Grundlagen hier kopieren und erklären. Die nächste Hürde ist die Einrichtung des "Message Brokers". In diesem Beispiel wird Redis als solches verwendet. Hier

ist ein Skript kümmern Herunterladen und Ausführen redis für Sie, run-redis.sh:

#!/bin/bash 
if [ ! -d redis-stable/src ]; then 
    curl -O http://download.redis.io/redis-stable.tar.gz 
    tar xvzf redis-stable.tar.gz 
    rm redis-stable.tar.gz 
fi 
cd redis-stable 
make 
src/redis-server 

Wenn Sie diese folgen linear sollten Sie jetzt ein Terminal Lauf redis haben, und Jetzt müssen Sie zwei weitere öffnen, einen, um Sellerie zu betreiben und dann einen, um den Dev-Server laufen zu lassen.

celery worker -A app.celery --loglevel=info 

Dann:

python app.py 

app.run() Unter der Annahme, in app.py genannt.

schließlich auf Ihren Anwendungsfall anpassen würden Sie in app.pyAufgaben benötigen erstellen.

from celery import Celery 

@app.task 
def add(x, y): 
    return x + y 

die im Hintergrund laufen lassen, wie:

add.delay(4, 4) 

Das ist die jist es ist. Sie können festlegen, dass Aufgaben in der Zukunft ausgeführt werden. Sie können auch Tasks einrichten, die regelmäßig ausgeführt werden: http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html