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

Js ngồi cùng mâm với các ngôn ngữ như php, ruby, python. Vì ngôn ngữ kiểu yếu, không hổ trợ đa luồng. Js hơn đám kia 1 tí là ngôn ngữ hổ trợ tốt nonblocking IO.

Nếu viết web mà xài php mà chuyển qua nodejs là tương đương.

Mấy ngôn ngữ làm backend mạnh hơn 1 tí là Java, C#, Golang. Ngôn ngữ này hổ trợ đa luồng tốt, ngoài ra là ngôn ngữ kiểu mạnh và ngôn ngữ biên dịch chứ hông phải thông dịch như đám trên.

Còn ngôn ngữ mạnh hơn gồm có c/c++ , rust. Ngôn ngữ kiểu này hơn bên trên là không có bộ gom rác tự động, vòng đời bộ nhớ mình phải tự quản lý.

Ngôn ngữ càng tự động nhiều thì mình đỡ xử lý, đỡ viết code, đỡ mất thời gian học. Ngược lại thì mấy ngôn ngữ cho mình tự làm thì mình có thể tối ưu được nhiều thứ.

Vậy nên js không sinh ra để lập trình đa luồng. Nếu muốn đa luồng thì sử dụng ngôn ngữ khác nha.
 
theo mình thì nodeJS sinh ra dành cho Web, cho API vốn đa luồng không cần thiết, vì các requests giữa các client có cần trao đổi Data / Param đâu. Còn muốn tận dụng hết số CPU Cores thì nó có Cluster rồi còn gì
 

Mời các anh :D A nào thích single threaded theo phong cách muti thì xem. Tôi nhắc lại là "theo phong cách" nhé chứ các a k thể nào cho JS nó đổi bản chất single threaded được.

Nên tôi chốt lại JS là single threaded vì bản chất của nó là chỉ chạy được duy nhất 1 lệnh/core trong 1 thời điểm có thể là 0,000000001s chẳng hạn. Còn lại là nó gọi process khác vào xử lý theo cơ chế callback thì hiểu là dealing Process (xử lý phân chia một / nhiều nhiệm vụ ra nhiều process rồi return result của các process này vào single threaded để tiếp tục hoàn thành nhiệm vụ (tập lệnh)).

1637413565830.png


Nói chung, ae muốn JS là một ngôn ngữ mạnh thì bắt buộc phải thêm cái món C/C++ vào bổ trợ cho nó. JS lại cùng họ với C nên học 2 món cùng lúc cũng dễ thôi. Sau đấy thì nhét mã C thành Shared library hoặc Addon vào Nodejs. Muốn xử lý bài toán nặng thế nào cũng xong. Đa luồng hay tuần tự đều ok good gooddd:p
 
Last edited:
V8 nó là engine viết bằng C++ chứ không phải nó là C++, nếu nói chạy trên V8 là C++ thì chẳng khác nào nói Java cũng là C++ vì JVM phổ biến nhất của Java cũng viết bằng C++
V3so9BC.png
 
V8 nó là engine viết bằng C++ chứ không phải nó là C++, nếu nói chạy trên V8 là C++ thì chẳng khác nào nói Java cũng là C++ vì JVM phổ biến nhất của Java cũng viết bằng C++
V3so9BC.png
Là sao bác. Bác nói câu này em chưa hiểu lắm. Giải thích kỹ hơn chút đc ko ạ
 
Lập trình đa luồng khó nhưng là bắt buộc nếu muốn tận dụng toàn bộ sức mạnh của cpu multicore, 1 thread bị treo không ảnh hưởng đến thread khác. Tuy nhiên lập trình bất đồng bộ lại tận dụng tài nguyên cpu tốt hơn trong môi trường single core và nặng về io.
Muốn kết hợp ưu điểm của cả hai thì phải cần 1 công nghệ mới: green thread hay coroutine. Nếu cpu chỉ có 1 core thì coroutine xử lý bất đồng bộ tương tự nodejs, nếu cpu có nhiều core thì coroutine hoạt động tương tự java, mỗi coroutine là 1 thread.
 
Chủ đề này khá hay với các bạn Junior. Mình xin thêm đưa 1 ví dụ thực tế để các bạn hiểu được cách hoạt động bất đồng bộ dựa trên single thread của NodeJS nó khác với multithread của Java như thế nào:

Tưởng tượng có 2 nhà hàng A và B. Công việc của 2 nhà hàng thì khá tương đồng, bao gồm:
1. Nhận thông tin yêu cầu từ khách hàng
2. Chế biến món ăn trong bếp
3. Giao hàng và nhận tiền từ khách

Tuy thế, cách thức hoạt động của 2 nhà hàng lại hoàn toàn khác nhau:

Nhà hàng A (Java), nhà hàng này có lợi thế là con cháu đông nên tuyển được nhiều nhân viên phục vụ khách hàng (multi-thread):
  • Mỗi khi có khách hàng vào thì cử 1 đứa ra xử lý khách đó
  • Đứa này sẽ nhận yêu cầu từ khách
  • Xong vào đưa yêu cầu cho bếp, rồi đứng đợi bếp làm
  • Sau khi bếp làm xong thì đưa đơn hàng ra giao cho khách

Nhà hàng B (NodeJS), nhà hàng này vốn bé, đc mỗi 1 đứa nhân viên tiếp khách (single-thread):
  • Mỗi khi có khách thì nó nhận yêu cầu
  • Chuyển yêu cầu của khách vào cho bếp chế biến
  • Bảo khách ngồi đợi đó (await)
  • Xong nó quay qua tiếp khách khác
  • Khi bếp xong 1 đơn, sẽ báo ra cho nó
  • Nó nhận đơn từ bếp và bàn giao cho khách tương ứng

Như vậy, khi lượng khách hàng đông lên, ai sẽ phục vụ khách hàng tốt hơn ?
 
mấy bác cho em hỏi, bản chất thằng js đơn luồng, nhưng có thể đa luồng nhờ vào webwroker, vậy tại sao 1 ngôn ngữ sinh ra ban đầu là đơn luồng, lại nhờ thằng khác có thể đa luồng được là ntn nhỉ?
 
mấy bác cho em hỏi, bản chất thằng js đơn luồng, nhưng có thể đa luồng nhờ vào webwroker, vậy tại sao 1 ngôn ngữ sinh ra ban đầu là đơn luồng, lại nhờ thằng khác có thể đa luồng được là ntn nhỉ?
Underlying/native APIs sử dụng đa luồng, hoặc 1 luồng, hoặc ma thuật. Cái này ko quan trọng với người sử dụng JS, ta chỉ quan tâm nó sẽ gọi callback function khi cần gọi thôi. Webworker ko phải đa luồng thực sự, giống như việc spawn một process mới vậy, khác với traditional threads có sharing memory. Chính vì thế cũng ít đau đầu hơn.
Nói chung JS làm xử lý logic, điều phối là hợp lý. CPU bound tasks thì nên tránh
 
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 ạ?
 
Back
Top