variable template taggit language examples actions django orm celery

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.

Aquí hay un gran tutorial sobre cómo comenzar a usarlo.

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!