Lạm bàn một chút về single thread trong Javascript, có khác mấy ngôn ngữ khác không ?



  • [single thread] đã nói lên vấn đề, nhưng trong vài cuộc tranh luận gần đây nhiều member do nhầm lẫn hoặc gây nhầm lẫn cho người khác bằng những cụm từ như chạy ngầm, xử lý song song.

    Cơ bản điểm khác nhau của JS và các ngôn ngữ khác nằm ở callback, tức nếu yêu cầu một tác vụ nào đó thường liên quan đến I/O như truy xuất DB, đọc file, gọi ajax . . . nó sẽ ra yêu cầu và việc xử lý có thể do process bên ngoài đảm nhận (như Mongodb, mysql, broswer . . . ) và khi nào có kết quả thì nó trả về qua callback.

    Khả năng này làm nodejs trong như nhanh hơn các ngôn ngữ khác, có khả năng xử lý song song . . .

    Còn làm multi-thread không phải cứ code là tự nó multi-thread, các ngôn ngữ support tính năng này như Java/C# phải khai báo kiểu đối tượng, cài đặt tiến trình, kiểm xoát tiến trình . . . nên thường coding thì điều single thread như nhau thôi !

    VD PHP có support xử lý multi-thread nhưng thậm chí nó còn không được khuyến khích xử dụng. Khi chạy web các tác vụ thường phải thực hiện tuần tự nên gần như không có chổ cho multi-thread.

    Với mình thì hiểu thế nào cũng OK, quan trong nắm được bản chất của nó !

    Còn làm multi-thread không phải cứ code là tự nó multi-thread, các ngôn ngữ support tính năng này như Java/C# phải khai báo kiểu đối tượng, cài đặt tiến trình, kiểm xoát tiến trình . . . nên thường coding thì điều single thread như nhau thôi !



  • túm lại đơn giản cho dễ hiểu: bạn có CPU 4 nhân, 8 threads. Giờ muốn tìm số lớn nhất trong 1 triệu records. Với nodejs thì nó phải tuần tự từng phần tử vì nó single-thread. 1 thread chạy cắm đầu, 7 threads kia ngồi cười khúc khích. Nhưng với Java, công việc được chia đều ra cho các threads còn lại, nên tốc độ sẽ xử lý được nhanh hơn(Stream trong java).



  • Single thread chắc chắn sẽ chạy chậm hơn multi thread. Nếu app viết tốt cho multi thread sẽ chạy nhanh hơn vì nó tận dụng được tất cả các Core của CPU. 1 task trên NodeJS có thể không chạy nhanh hơn php. Nhưng do cơ chế none-blocking I/O nên NodeJS sẽ không phải chờ cho một những tác đọc database, đọc file,... Cho nên nó sẽ tận dụng được tất cả thời gian cho CPU. Nó sẽ xử lý được nhiều request hơn. Có rất nhiều benchmark đã chứng minh đều đó bạn có thể google.

    vdu: http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/

    Tóm lại ưu điểm chính của NodeJS là none-blocking I/O.

    Để tận dụng hết số CORE, chúng ta có thể start nhiều NodeJS app cùng lúc và sử dụng kỹ thuật load balancing.

    papa elf

    0


  • Lại gặp bác Vũ Quang ở đây :D. Theo mình:
    1. Có khác không?
    Nếu javascript không dùng đến none blocking, 1 function chỉ bao gồm các công việc tuần tự, ko callback, ko promise, ko async&wait, ... còn java hoặc c# không khai báo multi thread thì javascript cũng giống các ngôn ngữ khác chạy đơn luồng (theo hiểu biết của mình là thế, lâu rồi ko chọc vào java với c# nên cũng ko rõ bọn nó có nâng cấp gì khác ko).
    2. Cái nào tốt hơn?
    Mỗi cái đều có lợi hại riêng. Tùy cơ ứng biến. Với việc phục vụ làm webserver, chat, ... thì nodejs đảm nhận tốt. Các công việc khác như xử lý những bài toán khổng lồ ví dụ như dự báo thời tiết, xử lý hình ảnh, bla bla ... những loại bài toán mà phải dùng đến siêu máy tính chẳng hạn thì dùng nodejs chắc đuối.



  • Về vụ multi-thread sẽ chạy nhanh hơn single-thread tôi chưa kiểm chứng. Về lý thuyết 1 CPU 1 core thì single chưa chắc chậm hơn multi.

    Nodejs không có multi-thread, nhưng có thể thực hiện ở cấp process bằng cách cho engine chạy nhiều process nodejs thay vì 1 process. Giống cách Apache/nginx quản lý PHP process.



  • Process hay thread đó là cách hệ điều hành chia nhỏ các công việc để thực hiện.
    Các công việc này có thể thiết kế cho một anh làm (đơn xử lý, đơn lõi) hoặc nhiều anh làm(đa xử lý, đa lõi). Việc của lập trình viên là quản lý các công nhân đang có làm việc dựa trên các công cụ (có thể hiểu là API) được cung cấp. Hiệu quả hay không còn phụ thuộc vào cách anh quản lý.
    Khi nghĩ đến xây dựng một hệ thống xử lý khai thác dữ liệu khổng lồ thì người ta nghĩ đến một hệ thống song song phân tán chứ không phải là (nodejs hoặc php hoặc go...) Khi đó (nodejs hoặc php hoặ go...) có thể sẽ là một phần của hệ thống đó. Nếu như làm một website như Facebook, LinkedIn, PayPal mà chỉ dùng nodejs thì như vậy nodejs toàn năng quá.
    Mình vẫn nhớ mang máng một câu nói: "khi hàng hoá trở nên nhiều hơn người ta sẽ không nghĩ cách làm con ngựa to lên".


Log in to reply