Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

75
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda