Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

779
Views
Propiedad del modelo de Django en la función asíncrona llamada desde la vista de sincronización

Necesito convertir algunas de mis vistas de Django para que funcionen con funciones asíncronas que consultan fuentes de datos. Estoy experimentando grandes problemas de rendimiento ya que esas consultas se ejecutan una por una en serie. Sin embargo, la tarea es mucho más difícil de lo previsto.

He indicado a continuación donde comienzan los problemas. También estoy experimentando otros problemas, sin embargo, este es, con mucho, el que no tengo ni idea de qué hacer. Recibo el siguiente error donde se indica en el siguiente código:

django.core.exceptions.SynchronousOnlyOperation: no puede llamar a esto desde un contexto asíncrono; use un hilo o sync_to_async

model2 es una propiedad ForeignKey que apunta a otro modelo.

Envolver model1.model2 dentro de sync_to_async() no funciona.

¿Alguna idea de cómo hacer que esto funcione?

 async def queryFunctionAsync(param1, param2, loop): model1 = await sync_to_async(Model1.objects.get)(pk=param1) model2 = model1.model2 # This is where the error is generated def exampleView(request): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) data = async_to_sync(queryFunctionAsync)(param1, param2, loop) loop.close()
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Suponiendo que tiene algún tipo de vista de Django y cuando realiza una solicitud a la view , desea que se ejecute una función en segundo plano para mejorar el tiempo de respuesta de la view . No tiene mucho sentido tener funciones asíncronas si tiene que convertirlas en síncronas para que sean compatibles con su vista o insertar una await en todas partes.

Si fuera yo, recomendaría usar un marco de transmisión de eventos como el celery que le permitirá ejecutar tareas en segundo plano y descargar el procesamiento de sus vistas de django a escala. Un ejemplo sería una vista de django que permite al usuario publicar un mensaje en un foro, es posible que tenga algún procesamiento de lenguaje natural que pueda ocurrir después de enviar el mensaje. En lugar de bloquear los subprocesos de vista de django, puede descargar el procesamiento a una @shared_task en apio y esto mejorará la experiencia de usuario.

Un trabajador en su grupo de apio recogerá la tarea de una cola y realizará el procesamiento en segundo plano. Una vez que se haya completado el procesamiento en segundo plano, puede usar django-channels websockets para alertar al usuario sobre la finalización de la tarea y cualquier resultado que deba presentarse al cliente. Celery también le permite encadenar varias tareas juntas y esperar un resultado usando un concepto llamado chord callback .

A medida que sus consultas toman más tiempo y los conjuntos de datos aumentan de tamaño, también puede aprovechar los servicios de base de datos de archivos planos, como elasticsearch o mongodb para mejorar el rendimiento de consultas anidadas más avanzadas a escala.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!