thảo luận Javascript có thực sự là single thread ?

  • Người tạo chủ đề Người tạo chủ đề teeeeeeeee
  • Ngày bắt đầu Ngày bắt đầu
Cho em hỏi ngu cái, nếu thằng event loop nó trả về đúng lúc bên stack đang nhét 1 lệnh thực thi luôn thì sao nhỉ? 2 thằng cùng dc nhét vào cùng lúc thì sao nó biết nhét thằng nào vào trước
 
Cho em hỏi ngu cái, nếu thằng event loop nó trả về đúng lúc bên stack đang nhét 1 lệnh thực thi luôn thì sao nhỉ? 2 thằng cùng dc nhét vào cùng lúc thì sao nó biết nhét thằng nào vào trước

Chiểu theo cái video giải thích của Philip Roberts, và theo cách mà 1 js program được load nhé, thì mình thấy ko thể có trường hợp như bạn mô tả xảy ra.
Khi 1 js program được load, trong cái execution context đó thì hàm main (entry point of the program) được load thẳng vào call stack, cùng với đó là tất cả các hàm được gọi đến trong main. Tất cả đống này trong stack là đống data duy nhất được load trực tiếp vào stack mà ko thông qua event loop.
Sau đó mọi data khác muốn được đẩy vào stack đều phải đi qua event loop.
Đó cũng là điều giải thích cho trường hợp tạo ra 1 cái js loop gọi vô hạn đến 1 hàm, làm treo đơ luôn browser
VD với cái program này:
JavaScript:
function foo() {
    return foo();
}
foo();
hàm foo được gọi đến liên tục, call stack cứ thế đầy lên mà ko pop đc cái data nào ra cả, dẫn tới ko có bất cứ data nào trong event loop đc push vào stack cả (khi stack chưa thỏa mãn điều kiện empty) làm treo luôn browser hoặc xuất hiện lỗi "RangeError: Maximum call stack size exceeded"
 
Cho em hỏi ngu cái, nếu thằng event loop nó trả về đúng lúc bên stack đang nhét 1 lệnh thực thi luôn thì sao nhỉ? 2 thằng cùng dc nhét vào cùng lúc thì sao nó biết nhét thằng nào vào trước
Chiểu theo cái video giải thích của Philip Roberts, và theo cách mà 1 js program được load nhé, thì mình thấy ko thể có trường hợp như bạn mô tả xảy ra.
Khi 1 js program được load, trong cái execution context đó thì hàm main (entry point of the program) được load thẳng vào call stack, cùng với đó là tất cả các hàm được gọi đến trong main. Tất cả đống này trong stack là đống data duy nhất được load trực tiếp vào stack mà ko thông qua event loop.
Sau đó mọi data khác muốn được đẩy vào stack đều phải đi qua event loop.
Đó cũng là điều giải thích cho trường hợp tạo ra 1 cái js loop gọi vô hạn đến 1 hàm, làm treo đơ luôn browser
VD với cái program này:
JavaScript:
function foo() {
    return foo();
}
foo();
hàm foo được gọi đến liên tục, call stack cứ thế đầy lên mà ko pop đc cái data nào ra cả, dẫn tới ko có bất cứ data nào trong event loop đc push vào stack cả (khi stack chưa thỏa mãn điều kiện empty) làm treo luôn browser hoặc xuất hiện lỗi "RangeError: Maximum call stack size exceeded"
Ko hẳn, mình nhớ đợt trước có xem cái video xong đào sâu mấy blog về cái này thì khi nào trong call stack đc clear hết thì mới push tiếp cái event loop đã đc resolve vào stack để thực thi
Ví dụ hàm set time out 3s sau đúng 3 giây nó resolved nhưng đúng lúc đó trong stack còn lệnh thì vẫn thực thi hết cái lệnh đó rồi mới làm tiếp cái set time out kia. Thời gian sẽ chậm hơn 3s
 
À em quên mất, mấy thằng chạy luôn nó trên thằng Main, chạy hết đống trong main rồi nó mới vứt thằng main ra->empty-> chạy event loop
Thanks 2 bác :D
 
Js là single thread , giả sử có 1 biến global tên running đi, hàm 1 đầu hàm set running là true, cuối hàm set lai về false , hàm 2 log lại biến running,hàm 1 ko chứa hàm 2, ko bao giờ log lại dc biến running là true hết vì 2 hàm không bao giờ thực hiên đồng thời
 
Như mấy bác trên nói thì luôn có hàm main() ở cuối cùng của stack. Thì rõ ràng theo nguyên tắc là stack phải empty hết thì event loop mới đưa vào.
Còn nếu mà multi thread thì multi ở chỗ webApi thì có khả năng nhỉ. WebApi em nghe nói là do c++ xử lý

Sent from Vsmart Active 3 using vozFApp
 
Lúc còn làm cho cty, cũng hay được đi phỏng vấn cùng leader. Đã pv khá nhiều ứng viên cho vị trí Js/Nodejs, hay hỏi một câu "Lấy một ví dụ để minh họa Js chạy trên môi trường trình duyệt web chrome là single thread", mới gặp được 1 cậu trả lời khá ưng, còn lại thì hơi mung lung.
câu trả lời khá ưng như nào vậy fen
review cho ae nghe với
 
nếu loop với 1 con số lớn, đặt 1 button click alert. Loop chạy, lúc này browser hầu như treo, không click vào được button. Vậy có phải là chứng minh cho việc js là single thread không các thím. Vào đọc tẹo thấy hổng kiến thức luôn rồi =((
 
nếu loop với 1 con số lớn, đặt 1 button click alert. Loop chạy, lúc này browser hầu như treo, không click vào được button. Vậy có phải là chứng minh cho việc js là single thread không các thím. Vào đọc tẹo thấy hổng kiến thức luôn rồi =((
Việc treo là tại vì chính hàm loop đó sẽ block main thread, ko cho browser sử dụng main thread để render.
Bản thân JS là single thread nhưng hệ sinh thái của nó thì ko, trên browser thì sẽ có những Web API thực hiện những async task nhờ Event Loop. Nhưng để execute được những async task thì đều phải đẩy cho main thread để thực thi :byebye:
 
Việc treo là tại vì chính hàm loop đó sẽ block main thread, ko cho browser sử dụng main thread để render.
Bản thân JS là single thread nhưng hệ sinh thái của nó thì ko, trên browser thì sẽ có những Web API thực hiện những async task nhờ Event Loop. Nhưng để execute được những async task thì đều phải đẩy cho main thread để thực thi :byebye:

Nếu fen dùng C while true thì main thread cũng bị block mà, theo mình thì k tìm dc ví dụ chứng minh :censored:.

Sent from Xiaomi Redmi Note 9S using vozFApp
 
nếu loop với 1 con số lớn, đặt 1 button click alert. Loop chạy, lúc này browser hầu như treo, không click vào được button. Vậy có phải là chứng minh cho việc js là single thread không các thím. Vào đọc tẹo thấy hổng kiến thức luôn rồi =((
Khi muốn khẳng định một vấn đề, bạn phải làm rõ vấn đề trước. Định nghĩa "single thread" đang được đề cập tới ở đây là gì? Thậm chí Javascript đang được nhắc tới ở đây là gì?

Mình sẽ đưa ra một statement là "Javascript là một single-thread language", trong đó single-thread nghĩa là chỉ có một thread được phép sử dụng/tồn tại, language là ngôn ngữ lập trình, còn Javascript ở đây là ECMAScript.

Nếu với nhu cầu kiểm định statement trên thì câu trả lời là sai. Không có một spec/định nghĩa nào quy định rằng ECMAScript chỉ được phép implement với 1 thread duy nhất cả, nếu ai đó muốn phản biện, hãy gửi bằng chứng spec vào đây.

Vậy tại sao mọi người hay claim rằng "Javascript là single thread language". Theo mình thì idea ở đây là không sai, và chúng ta ngầm hiểu với nhau về cái idea này. Nên kể cả khi phỏng vấn, bạn khẳng định như vậy vẫn sẽ có nhiều người chấp nhận. Lý do là "Javascript" mà chúng ta thường làm việc, trên brower, môi trường node.js thì JS đều có đầy đủ tính chất của một single-thread programming language. Ta viết code mà không cần quan tâm tới thread-safe, sử dụng biến vô tội vạ mà không cần dùng mutex lock, semaphore. Bản thân ECMAScript cũng không support các API làm các điều này. Lý do thì có thể check spec, mục 9.4: https://262.ecma-international.org/13.0/
Ngta bảo là "Tại bất kỳ thời điểm nào, tối đa chỉ có 1 execution context cho mỗi agent đang thực sự run code". Đây là lý do chúng ta có tất cả các tiện ích giống như 1 single-thread programming model. Nhưng điều này không có nghĩa là JS chỉ được phép có 1 thread.

Note: Vụ clarify này rất quan trọng nhé, nhất là khi đi phỏng vấn. Nhờ clarify vấn đề tốt mà mình được promote lên 1 level so với kỳ vọng đấy.
 
Trình còi đừng quan tâm nó là gì cho mệt. Quan tâm trên js viết đang viết async thì cố hiểu rồi control nó. Chứ cái này trừ khi level cao thì mới cần thiết hiểu để làm chứ trình gà 3 5 năm kinh nghiệm thôi khỏi cần đi.
Bao nhiêu năm đi làm còn không biết cuối cùng thằng js này là thuộc loại nào đây.
 
Sửa lần cuối:
chuyên sâu js thì hỏi gì mấy bác nhỉ
bên java hỏi sâu thì hỏi về async concurrency này nọ
k biết sâu bản chất ngôn ngữ bên js thì là gì
 
chuyên sâu js thì hỏi gì mấy bác nhỉ
bên java hỏi sâu thì hỏi về async concurrency này nọ
k biết sâu bản chất ngôn ngữ bên js thì là gì
Js lâu lắm không code nữa, giờ mấy khai niệm event loop, hoisting, callback, bind, call, apply chắc chả mấy ai quan tâm :byebye:
 

Thống kê chủ đề

Ngày tạo
teeeeeeeee,
Người trả lời cuối
AnyaKyle,
Trả lời
199
Lượt xem
30.115
Quay lại
Lên đầu trang