thảo luận node JS vẫn chưa thể lập trình đa luồng

Các bác cho em hỏi em học trái ngành làm FE với Reactjs được 1 năm. Giờ muốn học thêm BE để hiểu sâu hơn về ngành thì học Nodejs có khả thi không ạ?
cứ học FE cho tốt đi bạn, nhảy sang BE làm gì,4 năm ĐH còn ko ăn thua BE mà
 
Bản chất thì multithread hay không nó không phụ thuộc vào language, mà phụ thuộc vào runtime/compiler nhé các anh. C ko dùng mấy cái lib kiểu pthread thì cũng ko multithread đc, mà sau này ông nào rảnh làm cái runtime hỗ trợ cho javascript create thread mutex các kiểu thì js nó cũng là multithread thôi
 
Học thêm để hiểu sâu hơn thôi bác. Em thấy làm FE mà không biết gì về BE cũng hơi chuối chuối :big_smile:
bác thích thì bác cứ học thôi, mỗi ng 1 ý, đường đi này với ng này đúng nhưng chưa chắc đã phù hợp với mình, nếu bác đã xđ là nó cần thiết với mình thì làm thôi, thay vì hỏi có nên học BE hay k thì bác nên tự đặt câu hỏi bđầu từ đâu và học ls cho hiệu quả. E cũng trái ngành đây, cũng reactjs, cũng đang vật lộn đi pv đây, cố gắng hoàn thành từng mục tiêu mình đặt ra thôi bác, e thấy chả có ai khuyên sai cả, mỗi người hướng đến 1 cái khác nhau thôi, bác muốn trở thành người tnao thì bác nên tự xđ con đường của mình.
// vào thớt này đọc mấy bác tranh luận cứ như mở não vậy :sweat:
 
bác thích thì bác cứ học thôi, mỗi ng 1 ý, đường đi này với ng này đúng nhưng chưa chắc đã phù hợp với mình, nếu bác đã xđ là nó cần thiết với mình thì làm thôi, thay vì hỏi có nên học BE hay k thì bác nên tự đặt câu hỏi bđầu từ đâu và học ls cho hiệu quả. E cũng trái ngành đây, cũng reactjs, cũng đang vật lộn đi pv đây, cố gắng hoàn thành từng mục tiêu mình đặt ra thôi bác, e thấy chả có ai khuyên sai cả, mỗi người hướng đến 1 cái khác nhau thôi, bác muốn trở thành người tnao thì bác nên tự xđ con đường của mình.
// vào thớt này đọc mấy bác tranh luận cứ như mở não vậy :sweat:
Hehe em cũng đang nghiên cứu thêm mà thấy nhiều ngôn ngữ quá k biết nên học cái nào nên lên hỏi các cao nhân chỉ giáo thêm. Em thấy có thêm lời khuyên rồi mình rút ra kinh nghiệm vẫn nhanh hơn tự mình mò bác ạ.
 
Hehe em cũng đang nghiên cứu thêm mà thấy nhiều ngôn ngữ quá k biết nên học cái nào nên lên hỏi các cao nhân chỉ giáo thêm. Em thấy có thêm lời khuyên rồi mình rút ra kinh nghiệm vẫn nhanh hơn tự mình mò bác ạ.
theo e bác nên xđ xem mình theo hướng gì, học cái gì để làm gì, ví dụ như nếu e muốn theo hướng fullstack và muốn học BE thì e xđ OOP e còn yếu, e sẽ học 1 ngôn ngữ mạnh về OOP như Java hoặc C#, làm 1 dự án cá nhân khúc mắc chỗ nào k google được thì lên đây hỏi các bác đi trước,... Tóm lại ý e là bác nên hỏi các câu hỏi cụ thể hơn ấy, định hướng và sở thích của mình bác nên tự xem xét với khả năng của bản thân r quyết định,k nên hỏi mấy câu chung chung kiểu như có nên học BE hay k, bác hỏi kiểu đấy thì 9 ng 10 ý, thành ra mình thành đẽo cày giữa đường.
 
theo e bác nên xđ xem mình theo hướng gì, học cái gì để làm gì, ví dụ như nếu e muốn theo hướng fullstack và muốn học BE thì e xđ OOP e còn yếu, e sẽ học 1 ngôn ngữ mạnh về OOP như Java hoặc C#, làm 1 dự án cá nhân khúc mắc chỗ nào k google được thì lên đây hỏi các bác đi trước,... Tóm lại ý e là bác nên hỏi các câu hỏi cụ thể hơn ấy, định hướng và sở thích của mình bác nên tự xem xét với khả năng của bản thân r quyết định,k nên hỏi mấy câu chung chung kiểu như có nên học BE hay k, bác hỏi kiểu đấy thì 9 ng 10 ý, thành ra mình thành đẽo cày giữa đường.
Em hiểu ý bác rồi. Do em cũng mông lung muốn tìm hiểu dưới BE hoạt động như thế nào, cách nó liên kết làm việc với FE như thế nào. Bác rảnh thì em inbox tâm sự tí :love:
 
View attachment 876043

Event loop là cơ chế xử lý mấy thằng async, nếu gặp async thì cứ cho nó vào trong WebAPI mà xử lý và thực thi tiếp thằng dưới chứ không cần đợi. Sau khi trong WebAPI handle xong rồi thì nó tòi ra Callback queue rồi return ra promise callback theo thứ tự hoàn thành trước thoi. Await chỉ stop được trong function async và cũng đưa cái function đó vào WebAPI như promise chứ đâu có stop cả cái app lại đợi đâu.
Bác cho e hỏi :
  • ở đây theo e hiểu là các task trong stack được chạy, và cả trong web APIs cũng được chạy cùng lúc đúng k ạ?
  • Nếu cả 2 chạy cùng lúc, mà JS chỉ thực hiện 1 tác vụ tại 1 thời điểm là sao nhỉ?
  • Callback queue đợi Stack rỗng mới đẩy task vào. Vậy trên server có nhiều request liên tục thì có phải stack luôn có task, vậy thì sao callback queue rình nhét task của nó vào được?
 
Bác cho e hỏi :
  • ở đây theo e hiểu là các task trong stack được chạy, và cả trong web APIs cũng được chạy cùng lúc đúng k ạ?
  • Nếu cả 2 chạy cùng lúc, mà JS chỉ thực hiện 1 tác vụ tại 1 thời điểm là sao nhỉ?
  • Callback queue đợi Stack rỗng mới đẩy task vào. Vậy trên server có nhiều request liên tục thì có phải stack luôn có task, vậy thì sao callback queue rình nhét task của nó vào được?
vấn đề là mấy cái webAPI hay async task kia sẽ đẩy xuống, ko phải do js xử lý, thằng js đẩy xuống, đợi xong nhả callback ra thì js gọi callback đó, nên như thế là js chỉ xử lý 1 tác vụ thôi
 
vấn đề là mấy cái webAPI hay async task kia sẽ đẩy xuống, ko phải do js xử lý, thằng js đẩy xuống, đợi xong nhả callback ra thì js gọi callback đó, nên như thế là js chỉ xử lý 1 tác vụ thôi
Thấy bác để ava golang nên cho e mạn phép hỏi là bên go có thư viện hay runtime async nào không bác em mò mãi mà kiếm k ra :vv ( em đang học go )
 
vấn đề là mấy cái webAPI hay async task kia sẽ đẩy xuống, ko phải do js xử lý, thằng js đẩy xuống, đợi xong nhả callback ra thì js gọi callback đó, nên như thế là js chỉ xử lý 1 tác vụ thôi
À uh nhỉ :D.
Vậy có khả năng xảy ra case Stack luôn đầy(nhiều request từ client) khiến queue không thể đẩy task vào stack không? Như vậy thì quá tải bác nhỉ.
 
Bác cho e hỏi :
  • ở đây theo e hiểu là các task trong stack được chạy, và cả trong web APIs cũng được chạy cùng lúc đúng k ạ?
  • Nếu cả 2 chạy cùng lúc, mà JS chỉ thực hiện 1 tác vụ tại 1 thời điểm là sao nhỉ?
  • Callback queue đợi Stack rỗng mới đẩy task vào. Vậy trên server có nhiều request liên tục thì có phải stack luôn có task, vậy thì sao callback queue rình nhét task của nó vào được?
Psudo code của event loop.
Code:
while (EventLoop.waitForTask()) {
  const taskQueue = EventLoop.selectTaskQueue();
  if (taskQueue.hasNextTask()) {
    taskQueue.processNextTask();
  }

  const microtaskQueue = EventLoop.microTaskQueue;
  while (microtaskQueue.hasNextMicrotask()) {
    microtaskQueue.processNextMicrotask();
  }

  rerender();
}
Trực quan ở: https://www.jsv9000.app/
xem hết là hiểu chứ trình bày loằng ngoằng
À uh nhỉ :D.
Vậy có khả năng xảy ra case Stack luôn đầy(nhiều request từ client) khiến queue không thể đẩy task vào stack không? Như vậy thì quá tải bác nhỉ.
thì js sẽ báo maximum call stack size exceeded rồi crash thôi
 
Psudo code của event loop.
Code:
while (EventLoop.waitForTask()) {
  const taskQueue = EventLoop.selectTaskQueue();
  if (taskQueue.hasNextTask()) {
    taskQueue.processNextTask();
  }

  const microtaskQueue = EventLoop.microTaskQueue;
  while (microtaskQueue.hasNextMicrotask()) {
    microtaskQueue.processNextMicrotask();
  }

  rerender();
}
Trực quan ở: https://www.jsv9000.app/
xem hết là hiểu chứ trình bày loằng ngoằng

thì js sẽ báo maximum call stack size exceeded rồi crash thôi
E xin cảm ơn 2 bác :D
 
mà đọc lại thì callstack đầy thì không đẩy được function vào nữa là đúng, nhưng không phải là do nhiều request là nó đầy nhé hai cái khác nhau
 
gọi là bất đồng bộ, chứ multithread đâu phải :D thực tế chạy multithread cũng chả để làm gì, trừ khi tính toán nặng, chạy không khéo chỉ tổ làm tăng cpu thêm tốn điện chứ làm gì :D quan trọng là ổn định :D
 
Bác cho e hỏi :
  • ở đây theo e hiểu là các task trong stack được chạy, và cả trong web APIs cũng được chạy cùng lúc đúng k ạ?
  • Nếu cả 2 chạy cùng lúc, mà JS chỉ thực hiện 1 tác vụ tại 1 thời điểm là sao nhỉ?
  • Callback queue đợi Stack rỗng mới đẩy task vào. Vậy trên server có nhiều request liên tục thì có phải stack luôn có task, vậy thì sao callback queue rình nhét task của nó vào được?
Trả lời câu số 2: Để hiểu rõ hơn thì đầu tiên cần phân biệt nodejs (hoặc browser) và Javascript.
  • Javascript là ngôn ngữ
  • Nodejs là môi trường để thực thi Javascript, và nodejs bên cạnh main thread để chạy code Javascript nó còn có các worker threads.

Khi cầm 1 đoạn code Javascript đưa cho nodejs thực thi thì code Javascript được thực thi ở main thread, chạy đồng bộ từ trên xuống và khi gặp một cái web API hoặc I/O (fetch, setTimeout, readFile...), nó sẽ thực thi mấy cái này web API, I/O này ở các worker threads.

Có một câu hỏi khác là "Tại sao code Javascript được thực thi ở main thread mà mấy thằng fetch, readFile... được xử lý ở nơi khác. Vậy fetch không phải Javascript à?" => Đúng, cái thằng fetch bạn đang dùng chỉ là 1 cái API thôi, bạn dùng Javascript để tạo ra 1 yêu cầu "get cái url này và sau khi có kết quả thì đưa vào cái callback này để xử lý".

Còn cách nó get cái url như thế nào và nhận kết quả ra sao được viết bằng C++

Ảnh dưới là trích dẫn từ chính trang web của nodejs.

Screenshot 2023-08-01 at 12.27.19.png
 
Last edited:
đầy là khi nào thì đầy bác nhỉ?
JavaScript:
var i = 0;
function inc() {
  i++;
  inc();
}
   
try {
  inc();
}
catch(e) {
  // The StackOverflow sandbox adds one frame that is not being counted by this code
  // Incrementing once manually
  i++;
  console.log('Maximum stack size is', i, 'in your current browser');
}
tùy browser, tùy config nodejs, lấy đoạn code trên cho vào dev console browser là ra stacksize.

Cái page kia a cho code vào nghịch cũng đc:
1690868560369.png

muốn đầy stack size là do nested function rất nhiều chứ không phải do nhiều request gây ra.
 
Trả lời câu số 2: Để hiểu rõ hơn thì đầu tiên cần phân biệt nodejs (hoặc browser) và Javascript.
  • Javascript là ngôn ngữ
  • Nodejs là môi trường để thực thi Javascript, và nodejs có multithread.

Khi cầm 1 đoạn code Javascript đưa cho nodejs thực thi thì code Javascript được thực thi ở main thread, chạy đồng bộ từ trên xuống và khi gặp một cái web API hoặc I/O (fetch, setTimeout, readFile...), nó sẽ thực thi mấy cái này web API, I/O này ở thread khác (nodejs có thread pool).

Có một câu hỏi khác là "Tại sao code Javascript được thực thi ở main thread mà mấy thằng fetch, readFile... được xử lý ở nơi khác. Vậy fetch không phải Javascript à?" => Đúng, cái thằng fetch bạn đang dùng chỉ là 1 cái API thôi, bạn dùng Javascript để tạo ra 1 yêu cầu "get cái url này và sau khi có kết quả thì đưa vào cái callback này để xử lý".
Còn cách nó get cái url như thế nào và nhận kết quả ra sao được viết bằng C++.

Ảnh dưới là trích dẫn từ chính trang web của nodejs.

View attachment 1988811

Bài blog post này phân tích khá rõ.
Nodejs ko có multi-thread nhé bác, mặc dù có worker thread xử lý các task I/O song song nhưng ko được coi là multi-thread vì nó thư viện libuv nó viết bằng C++ nhé bác, phải chung core mới multi-thread được, bác có thể tìm hiểu thằng Deno nó giống Nodejs viết bằng Rust
 
Back
Top