Javascript là ngôn ngữ single thread, tại sao nó có thể làm nhiều việc cùng 1 lúc?

Chào cả nhà,

Theo em hiểu thì javascript chỉ xử lý tuần tự từng task một, những task là bất đồng bộ sẽ được xếp vào callback queue để event loop chờ stack trống sẽ đưa các stask trong callback queue vào stack để xử lý.

    // task 2
    setTimeout(()=>{
     // console.log("Call API")
    },0);

  //task 1
    for(let i = 0; i < 10000000; i++){
     console.log(`render UI  ${i}`);
}

Trong đoạn code trên thì js chờ task 1 chạy xong thì task 2 mới bắt đầu chạy, chứ không thể vừa làm task 1 đồng thời vừa làm task 2 đúng không ạ?

Vậy tại sao youtube, facebook có thể xử lý nhiều việc cùng 1 lúc? Ví dụ trường hợp xem live stream trên facebook: giao diện facebook vừa phát video, vừa có thể xử lý file do user up lên (vừa xem live stream vừa upload file nặng gửi trong box chat), đồng thời socket có thể load commnet realtime, hiện notification, …

Em cảm ơn

đầu tiên,bạn cầu phải hiểu câu hỏi của bạn trước
"đồng thời" là gì? là concurrency hay parallelism hay là cái gì đó khác?

4 Likes

Cậu thử tham khảo topic này xem:

Có lẽ nó sẽ giúp cậu :smile:

5 Likes

Đúng vậy.

FTFY:

Theo em hiểu thì javascript runtime chỉ xử lý tuần tự từng task một, những task là bất đồng bộ sẽ được xếp vào callback queue để event loop chờ stack trống sẽ đưa các stask trong callback queue vào stack để xử lý.

Browser ngoài javascript runtime còn có nhiều process khác nữa, ngoài việc thực thi JS thì browser còn nhiều tác vụ khác: render, UI, networking,… nên mặc dù JS là singlethread nhưng browser thì không.

6 Likes

Em vẫn chưa hiểu asynchronous trong javascript liên quan gì đến concurrency, parallelism :cry:

đó là những khái niệm bạn cần hiểu để trả lời được câu hỏi này
“nó” có thể làm nhiều việc cùng lúc, bạn cần phải biết “nó” là ai

4 Likes

“Nó” là Javascript engine đúng không ạ? concurrency, parallelism do js engine chạy tự động chứ dev không can thiệp được? :thinking:

1 Like

JS engine mỗi lúc chỉ làm một việc, nhưng nó không làm việc một mình mà trong môi trường có nhiều thành phần khác.
Cụ thể ở frontend nó chạy trong trình duyệt và nhiều phần việc nó gửi đi để bộ phận khác thực hiện.
Sau khi gửi xong yêu cầu đi, nó sẽ tiếp tục chạy công việc tiếp theo.
Khi nào bộ phận quay lại với kết quả công việc kia, nó sẽ xử lý kết quả đó.

Ví dụ trong code sau, dòng console(“Viec 1”) xuất hiện trước, nhưng lúc đó JS engine chỉ gửi yêu cầu đếm giờ cho setTimeout là một thành phần không thuộc JS engine, sau đó nó chạy tiếp dòng console.log(“Viec 2”).
Lúc này, setTimeout thấy thời gian chờ chỉ là 0 giây nên báo lại cho JS engine để nó in ra dòng console.log(“Viec 1”).

Vì thế kết quả ta sẽ thấy Viec 2 phía trên Viec 1

// Việc 1:
setTimeout(() => {console.log("Viec 1"); }, 0);

// Việc 2:
console.log("Viec 2");
5 Likes

Tiện thể, em gái tôi mà học JS thì chắc sẽ nó rất giỏi, vì mỗi khi nấu ăn nó liên tục sai tôi lấy thứ nọ, làm thứ kia.

Thực chất nó vẫn nấu bếp single-threaded nhưng vẫn đa nhiệm một cách asynchronous

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?