-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội
Có chạy được không?
Chúng ta vẫn thường nghe thấy javascript là single thread, dart là single thread phải không nhỉ? Nhưng liệu nó có đúng single thread, nghĩa là cả chương trình của chúng ta chỉ có 1 thread duy nhất đang chạy mà thôi? Chúng ta hãy cùng đi giải mã bí ẩn này nhé.
Thử chạy Node.js
Chúng ta hãy tạo ra file index.js
với 1 dòng duy nhất:
while(true);
Để đảm bảo chúng ta không tạo ra bất kì thread nào ngoài main thread. Sau khi chạy chương trình trên MacOS, chúng ta sẽ count số thread với câu lệnh:
NUM=`ps M <pid> | wc -l` && echo number of thread is: $((NUM-1))
Trên máy của mình sẽ nhận được kết quả thế này:
Nghĩ là đang có 7 thread đang tồn tại trong chương trình của chúng ta.
Thử chạy với dart
Chúng cũng tạo ra một app có file hello_world.dart
với 1 dòng duy nhất:
while(true);
Cũng là để đảm bảo chúng ta không tạo ra bất kì thread nào ngoài main thread. Và khi chạy lệnh count số thread mình nhận được kết quả:
Nghĩ là đang có 4 thread đang tồn tại trong chương trình của chúng ta.
Giải mã bí ẩn
Qua 2 ví dụ với các framework, chúng ta thể thấy thực sự không có đơn luồng nào ở đây cả. Nó có thể chỉ có 1 luồng duy nhất để xử lý, nhưng sẽ có rất nhiều luồng để cung cấp sự kiện và hỗ trợ cho nó.
Nhiều thành phần tác động
Một chương trình sẽ chịu tác động từ rất nhiều thành phần khác nhau. Các thành phần này có thể là:
- Mạng internet (hay socket): cung cấp dữ liệu cho chương trình.
- Từ các thiết bị ngoại vi: điều khiển chương trình.
- Trình dọn rác: giúp chúng ta tự động giải phóng bộ nhớ.
- Các trình lập lịch của hệ điều hành.
Đối với các chương trình chạy trên server thì nó chịu tác động chủ yếu từ socket để xử lý và phản hồi lại thông tin cho người dùng.
Một luồng duy nhất
Để rõ ràng hơn, chúng ta hãy nhìn vào chương trình chỉ có 1 luồng duy nhất này nhé:
public class SingleThread {
public static void main(String[] args) {
NonBlockingEventLoop eventLoop = new NonBlockingEventLoop(3000);
eventLoop.onUpdate(() -> {
// các event có thể được thêm ở đây.
eventLoop.addEvent(() -> System.out.println("Hello World"));
});
eventLoop.start();
// vòng lặp đã chạy, nên chúng ta sẽ không thể thêm event ở đây
}
}
Rõ ràng là chúng ta sẽ chỉ có hàm onUpdate
để thêm được các event và queue, như trong ví dụ chúng ta chỉ có mỗi việc in ra 1 dòng "Hello World". Câu hỏi đặt ra là làm thế nào để phát sinh ra được các sự kiện? Nếu không có sự kiện nào thì chương trình sẽ hoạt động 1 cách vô nghĩa.
Cơ chế chuyển luồng
Vậy câu hỏi đặt ra là với nhiều luồng như vậy thì làm sao đưa hết dữ liệu về main thread được?
Vậy với nhiều thành phần tác động, cũng tương đương với nhiều luồng tác động như vậy, thì làm sao chúng ta có thể chuyển hết sự kiện về 1 main thread duy nhất được? Câu trả lời đó là sự kết hợp giữa các queue và các event loop.
Các luồng I/O sẽ phát sinh ra các sự kiện cho main queue, main thread sẽ xử lý các sự kiện này và nó cũng tạo ra các sự kiện khác nhau cho các queue khác nhau. Các thread tương ứng với các queue này sẽ xử lý các event đó và tạo ra một vòng tuần hoàn cho chương trình của chúng.
Ưu điểm
Đơn luồng có một ưu thế cực lớn khi nó:
- Giúp chúng ta không phải lo lắng về lock, về synchronize, về race condition cũng như deadlock. Đặc biệt với các ứng dụng client, nơi chúng ta cần phải render đồ hoạ và đảm bảo tính nhất quán cao, tránh cho chương trình bị crash và tăng trải nghiệm của người dùng.
- Rất dễ dàng để tạo ra các chương trình với chỉ một vài dòng lệnh.
Nhược điểm
Nhưng được cái này thì lại mất cái kia. Không phải làm quen với synchronized hay lock thì chúng ta lại phải làm quen với async và await. Và đôi khi đơn luồng chính là cái bẫy khiến cho toàn bộ hệ thống của chúng ta bị treo, và đây không phải trường hợp hiếm gặp. Ví dụ với chương trình này:
function runWitPromise() {
return new Promise(resolve => {
while(true);
});
}
async function runAsync() {
runWitPromise();
}
runAsync();
console.log("Finished");
Vì hàm callback của promise sẽ gọi trên main thread nên while(true)
sẽ làm block toàn bộ chương trình của chúng ta nên Finished
sẽ không được in ra. Hậu quả là trong những chương trình xử lý phức tạp, khả năng phục vụ cho toàn bộ user sẽ bị chậm trễ, một hàm xử lý nặng nề nào đó sẽ làm cho toàn bộ hệ thống bị ảnh hưởng.
Tổng kết
Qua các thử nghiệm chúng ta có thể thấy rõ ràng với 1 thread duy nhất sẽ rất khó để tạo ra các chương trình lớn, phục vụ các bài toán phức tạp. Có chăng đơn luồng chỉ phục vụ cho các bài toán nhúng kiểu như đèn nhấp nháy hay các thiết bị tương đối đơn giản.
Cái mà chúng ta vẫn gọi là đơn luồng trên các framework như node.js, dart hay các redis, thực chất chỉ là "1 luồng xử lý duy nhất", chứ xung quanh nó vẫn tồn tại rất nhiều các luồng khác để làm I/O và GC.
Làm việc với đơn luồng sẽ giúp chúng ta tránh phải học các kiến thức đau đầu với đa luồng, tuy nhiên khi sử cụng await phải rất cẩn thận để tránh làm block cả chương trình, hãy ưu tiên sử dụng callback hơn nếu có thể nhé.
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội