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

80
Views
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 answers
Answer question

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 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!