examples - templates django settings
¿Puede Django hacer trabajos multi-hilo? (3)
- Sí, puede ser multihilo, pero generalmente uno usa apio para hacer el equivalente. Puedes leer sobre cómo en el tutorial de apio-django.
- Es raro que realmente desee forzar al usuario a esperar el sitio web. Si bien es mejor que se arriesgue un timeout.
Aquí hay un ejemplo de lo que estás describiendo.
User sends request
Django receives => spawns a thread to do something else.
main thread finishes && other thread finishes
... (later upon completion of both tasks)
response is sent to user as a package.
Mejor manera:
User sends request
Django receives => lets Celery know "hey! do this!"
main thread finishes
response is sent to user
...(later)
user receives balance of transaction
Tengo una pregunta, ¿puede Django hacer trabajos multi-hilo?
Esto es lo que quiero hacer: hacer clic en un botón en una página web, luego hay algunas funciones en model.py que se ejecutan, por ejemplo, rastrear algunos datos desde Internet, cuando termina, devuelve al usuario los resultados.
Me pregunto si tengo que abrir un nuevo hilo para ejecutar las funciones en model.py, ¿alguien puede decirme cómo hacerlo? Muchas gracias.
Como se muestra en esta respuesta , puede utilizar el paquete de subprocesos para realizar una tarea asíncrona. Todo el mundo parece recomendar el apio, pero a menudo es demasiado para realizar tareas simples pero de larga ejecución. Creo que en realidad es más fácil y más transparente utilizar hilos.
Aquí hay un ejemplo simple para asincer a un rastreador:
#views.py
import threading
from .models import Crawl
def startCrawl(request):
task = Crawl()
task.save()
t = threading.Thread(target=doCrawl,args=[task.id])
t.setDaemon(True)
t.start()
return JsonResponse({''id'':task.id})
def checkCrawl(request,id):
task = Crawl.objects.get(pk=id)
return JsonResponse({''is_done'':task.is_done, result:task.result})
def doCrawl(id):
task = Crawl.objects.get(pk=id)
# Do crawling, etc.
task.result = result
task.is_done = True
task.save()
Su interfaz puede realizar una solicitud de startTask
de startTask
para iniciar el rastreo, puede realizar una solicitud de Ajax para verificarlo con checkCrawl
que devolverá verdadero y el resultado cuando se checkCrawl
.
Si no desea agregar un marco de overkill a su proyecto, simplemente puede usar subprocess.Popen :
def my_command(request):
command = ''/my/command/to/run'' # Can even be ''python manage.py somecommand''
subprocess.Popen(command, shell=True)
return HttpResponse(status=204)