2016-07-09 6 views
2

Angenommen, ich habe 1000 user_ids in einer Tabelle und ich würde jede Stunde ausführen, um von Google API-Informationen zu erhalten und 3 Felder in dieser Tabelle zu aktualisieren. Wie wäre die Wirkung und wie kann sie effizient durchgeführt werden?Update Datenbankfelder stündlich mit Python/Django

Ich habe diese Variante gesehen:

m = Module.objects.get(user_id=1).update(field_one=100, field_two=200, field_three=300) 

und dieses:

m = Module.objects.get(user_id=1) 
m.field_one = 100 
m.field_two = 200 
m.field_three = 300 
m.save() 

auch, wie es so gemacht werden kann, dass es jede Stunde laufen und diese Informationen greifen ? Nie so etwas getan.

+0

Warum jede Stunde? Ihre 1000 Benutzer werden nicht 365 Tage im Jahr rund um die Uhr auf Ihrer Website sein. Die meisten Websites haben viele Benutzer, aber nur wenige normale Benutzer. Der Rest verlor das Interesse. Sie könnten also an eine Regel denken, die seltener überprüft. Eine Aufgabe starten, wenn sich ein Benutzer anmeldet? – allcaps

Antwort

2

Verwenden Sie Redis, Sellery, um jede Stunde eine asynchrone Taskwarteschlange einzurichten. Hier finden Sie https://realpython.com/blog/python/asynchronous-tasks-with-django-and-celery/ für weitere Informationen darüber, wie asych task queue system für django eingerichtet wird. Hier

ist der Code für tasks.py

from celery.task import periodic_task 
from celery.schedules import crontab 


@periodic_task(run_every=crontab(minute=0, hour='*/1')) 
def get_data_from_google_api(): 
    data_from_google =ping_google_api() # ping google api to get data 
    return Module.objects.get(user_id=1).update(field_one= data_from_google['field_one'], field_two= data_from_google['field_two'], field_three= data_from_google['field_three']) 

Schauen Sie hier für weitere Informationen:

  1. https://www.caktusgroup.com/blog/2014/06/23/scheduling-tasks-celery/
  2. How to run a Django celery task every 6am and 6pm daily?
1

Fof diesem Zweck benötigen Sie Hintergrund zum Ausführen von Abfragen mit periodische Aufgaben. Hier
ist am beliebtesten in django task-queue-libs
Zum Beispiel, wenn Sie den Einsatz Sellerie entscheiden, können Sie einfache periodische Aufgabe schreiben:

from celery.schedules import crontab 
from celery.task import periodic_task 

@periodic_task(
name='UPDATE_USER', 
run_every=crontab(
    minute='1', 
    hour='1,4,7,10,13,16,19,22')) 
def update_user(): 
    #get some value from api 
    Module.objects.filter(user_id=1).update(
     field_one=value, field_two=value, field_three=value) 

Alle Einstellungen für django Sie in celery docs aussehen kann