tutorial taggit framework español python database django multithreading background-thread

python - taggit - Tarea de fondo de Django



django tutorial español pdf (6)

Necesito llenar una base de datos SQLite cada pocos minutos en Django, pero quiero proporcionar datos obsoletos hasta que los datos estén disponibles para que la base de datos se actualice. (es decir, no quiero bloquear para recopilar los datos; la única vez que puedo bloquear es si hay un bloqueo en la base de datos, durante el cual no tengo otra opción).

Tampoco quiero instalar un programa o biblioteca por separado.

¿Cómo podría configurar otro subproceso que podría llamar a save() en un montón de modelos, sin tener problemas de subprocesos?


Depende de si necesita que la actualización se vea atómica desde el punto de vista de los lectores. Si no le importa ver datos antiguos y nuevos juntos, simplemente cree un comando de administración personalizado que rellene los datos y ejecútelo cada pocos minutos desde cron .

Si necesita que se vea atómico, envolver todas las escrituras en una transacción de SQLite a través de django.db.transaction probablemente debería proporcionarle los bloqueos necesarios.


Si está buscando una solución liviana para ejecutar cosas en segundo plano en lugar de un sistema completo de administración de tareas, eche un vistazo a django-utils . Incluye, entre otras cosas, un decorador de función @async que hará que una función se ejecute de forma asíncrona en un hilo separado.

Úsalo así:

from djutils.decorators import async @async def load_data_async(): # this will be executed in a separate thread load_data()

Luego puede llamar a la load_data_async function para el fondo, o la función normal load_data para bloquear la ejecución.

Solo asegúrese de instalar una versión anterior a la 2.0, ya que carece del decorador @async.

Nota: Si incluso instalar django-utils sería demasiado, simplemente puede descargarlo e incluir los pocos archivos necesarios en su proyecto.


Solo una rápida actualización de la respuesta de John Lehmann: django-background-task no se mantuvo e incompatible con la nueva versión de Django. Hace un tiempo lo actualizamos y ampliamos con nuevas características y mantenemos el nuevo paquete compatible con versiones anteriores en Github . La nueva aplicación django-background-tasks se puede descargar o instalar desde el PyPI.


Tuve el mismo problema, pero no quería ejecutar un servicio como el apio para resolver el problema.

Encontré posix_spawn en sistemas linux. Puede escribir comandos manage.py que se ejecutan en su entorno completo de django. Estos comandos se pueden ejecutar en segundo plano con este proyecto.

Si necesita devolver datos al sitio web durante la ejecución, utilizo memcached.

https://github.com/lukedupin/django_posix_spawn


Celery

El apio es una cola de tareas / cola de tareas asíncronas basada en el paso de mensajes distribuidos. Está enfocado en la operación en tiempo real, pero también admite la programación.

El apio está escrito en Python, pero el protocolo se puede implementar en cualquier idioma. También puede operar con otros idiomas usando webhooks.


La tarea en segundo plano de Django es una cola de trabajo con base de datos respaldada por Django, basada en la biblioteca DelayedJob de Ruby.

Decoras funciones para crear tareas:

@background(schedule=60) def notify_user(user_id): # lookup user by id and send them a message user = User.objects.get(pk=user_id) user.email_user(''Here is a notification'', ''You have been notified'')

Aunque todavía necesitas algo que programe esas tareas. Algunos beneficios incluyen reintentos automáticos para tareas fallidas y la configuración de la duración máxima para una tarea en ejecución.

Esto implica otra dependencia, pero podría ser útil para algunos lectores sin esa restricción.