taggit - django template variable
django/apio: ¿Mejores prácticas para ejecutar tareas en objetos Django de 150k? (3)
Intenta usar RabbitMQ en su lugar.
RabbitMQ se utiliza en muchas compañías más grandes y la gente realmente confía en él, ya que es un gran broker.
Tengo que ejecutar tareas en aproximadamente 150k objetos Django. ¿Cuál es la mejor manera de hacer esto? Estoy usando el Django ORM como Broker. El back-end de la base de datos es MySQL y se cuelga y muere durante el task.delay () de todas las tareas. Relacionado, también quería comenzar con el envío de un formulario, pero la solicitud resultante produjo un tiempo de respuesta muy largo que expiró.
También consideraría usar algo más que usar la base de datos como el "intermediario". Realmente no es adecuado para este tipo de trabajo.
Sin embargo, puede mover parte de esta sobrecarga fuera del ciclo de solicitud / respuesta al iniciar una tarea para crear las otras tareas:
from celery.task import TaskSet, task
from myapp.models import MyModel
@task
def process_object(pk):
obj = MyModel.objects.get(pk)
# do something with obj
@task
def process_lots_of_items(ids_to_process):
return TaskSet(process_object.subtask((id, ))
for id in ids_to_process).apply_async()
Además, como probablemente no tengas 15000 procesadores para procesar todos estos objetos en paralelo, puedes dividir los objetos en fragmentos de, digamos, 100 o 1000:
from itertools import islice
from celery.task import TaskSet, task
from myapp.models import MyModel
def chunks(it, n):
for first in it:
yield [first] + list(islice(it, n - 1))
@task
def process_chunk(pks):
objs = MyModel.objects.filter(pk__in=pks)
for obj in objs:
# do something with obj
@task
def process_lots_of_items(ids_to_process):
return TaskSet(process_chunk.subtask((chunk, ))
for chunk in chunks(iter(ids_to_process),
1000)).apply_async()
Yo uso beanstalkd ( http://kr.github.com/beanstalkd/ ) como motor. Agregar un trabajador y una tarea es bastante sencillo para Django si usa django-beanstalkd: https://github.com/jonasvp/django-beanstalkd/
Es muy confiable para mi uso.
Ejemplo de trabajador:
import os
import time
from django_beanstalkd import beanstalk_job
@beanstalk_job
def background_counting(arg):
"""
Do some incredibly useful counting to the value of arg
"""
value = int(arg)
pid = os.getpid()
print "[%s] Counting from 1 to %d." % (pid, value)
for i in range(1, value+1):
print ''[%s] %d'' % (pid, i)
time.sleep(1)
Para iniciar un trabajo / trabajador / tarea:
from django_beanstalkd import BeanstalkClient
client = BeanstalkClient()
client.call(''beanstalk_example.background_counting'', ''5'')
(fuente extraída de la aplicación de ejemplo de django-beanstalkd)
¡Disfruta!