簡體   English   中英

Mongodb node.js Promise.all 不並行工作

[英]Mongodb node js Promise.all not workiing in parallel

我正在制作一個約會應用程序。 一個用戶可以向另一個用戶發送日期請求,日期請求將存儲在不同的集合中。 在發送用戶配置文件時,服務器會檢查用戶是否已發送日期請求。

 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 }

parseUser() function 獲取原始用戶數據並計算年齡,檢查當前用戶是否與請求的用戶約會,檢查請求的用戶是否已將日期請求發送給當前用戶,並檢查當前用戶是否已將日期請求發送給請求的用戶。

 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具有不包括age, is_dating, has_sent_request的原始用戶數據

即使我使用Promise.all()上面的代碼也需要 3 秒才能完成。

有沒有優化或更好的方法來做到這一點?

如果您的DateRequest.findOne任務在同一個 worker 中執行,它們將有效地按順序運行。 每個工人都有一個線程。 因此,同一個工作人員中的所有任務都會排隊並一次處理一個。 如果您需要它們並行執行,您需要確保它們由不同的工作人員處理。 這將增加跨工作者消息傳遞的開銷。 但是,如果這些任務運行時間足夠長,它將提高性能。

這是node.js中討論多線程的幾篇文章

為了使多線程工作,您的數據庫訪問也必須是線程安全的。 在這種情況下,您還需要確保無論您正在閱讀MongoDB ,都可以安全地處理來自多個線程的同時訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM