Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

73
Vistas
Mongodb node js Promise.all no funciona en paralelo

Estoy haciendo una aplicación de citas. Un usuario puede enviar solicitudes de fecha a otro usuario, las solicitudes de fecha se almacenarán en una colección diferente. Mientras envía el perfil de los usuarios, el servidor verifica si el usuario ha enviado la solicitud de fecha o no.

 export async function parseUser(_user: any, current_user:UserInterface): Promise<UserProfile>{ if(!_user) return _user; const user: UserProfile = _user const now = moment(new Date()); const birthday = moment(_user.birthday); const years = moment.duration(now.diff(birthday)).asYears(); const task1 = DateRequest.findOne({request_sent_by: current_user.uid, request_sent_to: user.uid}); const task2 = DateRequest.findOne({request_sent_by: user.uid, request_sent_to: current_user.uid}); const [has_current_sent_date_request, has_this_user_sent_date_request] = await Promise.all([task1, task2]) user.age = Math.floor(years); user.is_dating = user.dates.includes(current_user.uid); user.has_saved = current_user.saved_users.includes(user.uid); user.has_current_sent_date_request = has_current_sent_date_request?true:false user.has_this_user_sent_date_request = has_this_user_sent_date_request?true:false return user }

Esta función parseUser() toma datos de usuario sin procesar y calcula la edad, verifica si el usuario actual está saliendo con el usuario solicitado, verifica si el usuario solicitado ha enviado la solicitud de fecha al usuario actual y también verifica si el usuario actual ha enviado la solicitud de fecha al usuario solicitado.

 console.time("time") const tasks = matching_users.map(async x => parseUser(x, res.locals.currentUser)) const parsed_users: UserProfile[] = await Promise.all(tasks) console.timeEnd("time") JSONReponse.success("success", parsed_users)

matching_users tiene datos de usuario sin procesar que no incluyen la age, is_dating, has_sent_request

Aunque utilicé Promise.all() el código anterior tarda 3 segundos en completarse.

¿Hay alguna optimización o mejor manera de hacer esto?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Si sus tareas DateRequest.findOne se ejecutan en el mismo trabajador, se ejecutarán de manera secuencial. Cada trabajador tiene un solo hilo. Por lo tanto, todas las tareas en el mismo trabajador se ponen en cola y se procesan una a la vez. Si necesita que se ejecuten en paralelo, deberá asegurarse de que sean manejados por diferentes trabajadores. Esto agregará una sobrecarga de mensajería entre trabajadores. Sin embargo, mejorará el rendimiento si estas tareas se ejecutan durante el tiempo suficiente.

Aquí hay un par de artículos que tratan sobre subprocesos múltiples en node.js

  • Node.js Multiproceso!
  • Cómo hacer subprocesos múltiples con Node.js

Para que los subprocesos múltiples funcionen, el acceso a la base de datos también tendrá que ser seguro para subprocesos. En ese caso, también deberá asegurarse de que, sin importar cómo esté leyendo MongoDB , será seguro manejar el acceso simultáneo desde múltiples subprocesos.

  • Concurrencia MongoDB
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda