2013-05-25 35 views
11

Hình sau được lấy từ Chương 3 của cuốn sách Secrets of the JavaScript Ninja của Jon Resig. Ở đây tác giả giải thích vòng lặp sự kiện trình duyệt.Khái niệm chuỗi đơn JavaScript chạy trong trình duyệt

enter image description here

Cuốn sách có nói điều này:

Điều quan trọng cần lưu ý rằng cơ chế trình duyệt mà đặt sự kiện vào hàng đợi là bên ngoài để mô hình vòng lặp sự kiện này. Việc xử lý cần thiết để xác định thời điểm sự kiện đã xảy ra và đẩy chúng lên hàng đợi sự kiện không tham gia vào chuỗi đang xử lý các sự kiện .

Vì vậy, câu hỏi của tôi là đúng khi nói rằng JavaScript trong trình duyệt là đơn luồng? Tôi hỏi câu hỏi này bởi vì rõ ràng hai nhiệm vụ riêng biệt (xử lý các sự kiện và sự kiện xếp hàng đang diễn ra song song ở đây).

+0

Đặt câu hỏi trên (có thể) thú vị hơn có thể là tác động của cái gọi là ** callbacks ngay lập tức ** (như được đề xuất trong [câu trả lời này] (http://stackoverflow.com/a/2734311/1711186)). Trong ngắn như vậy gọi lại ** ** ngay lập tức sẽ được mã Javascript chạy, trong khi mã khác bị chặn bởi một tuyên bố chặn (tức là 'alert()') vẫn chưa [chạy đến hoàn thành] (https://developer.mozilla.org /en-US/docs/Web/JavaScript/Guide/EventLoop#.22Run-to-completion.22). Bằng cách này, dường như nhiệm vụ thứ hai "xếp hàng sự kiện" có thể giới thiệu các vấn đề đa luồng (tức là tính xác định). Câu hỏi hay! – humanityANDpeace

+0

có thể trùng lặp của [JavaScript có được đảm bảo là đơn luồng không?] (Http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded) – Liam

Trả lời

9

JavaScript đơn luồng ở bất kỳ đâu, trong trình duyệt hoặc trong NodeJS. Nó không bao giờ được cho là để hỗ trợ xử lý đa luồng dưới mọi hình thức (và có lẽ nếu ai đó thực hiện một động cơ với một số loại multithreading JS, những điều tồi tệ sẽ xảy ra, chắc chắn)

EDIT để trả lời chỉnh sửa của bạn:

Đó hàng đợi sự kiện được lấp đầy với dữ liệu (sự kiện chuột/kb, sự kiện mạng, v.v.) từ vòng lặp chính của trình duyệt. Cùng một vòng lặp chính chạy JS. Con số bạn đăng là đúng nhưng nó (loại) làm mờ đi thực tế. AFAIK Chỉ có một luồng xử lý mọi thứ (nghĩa là, điền vào hàng đợi và chạy, từng dòng một, bất kỳ mã JS nào).

EDIT: Một cách để chứng minh điều này: Tạo vòng lặp thực sự dài và vùng văn bản. Cố gắng viết văn bản trong khi vòng lặp đang chạy. Bạn không thể: đó là vì vòng lặp chính đang bận chạy vòng lặp nên nó không thể xử lý các sự kiện kb.

EDIT: Đây có vẻ là một câu trả lời thực sự tốt: Is JavaScript guaranteed to be single-threaded?

2 năm sau khi EDIT lần cuối: Câu trả lời này là nhận được một chút cũ và tách ra từ thực tế. io.js (và node.js sau đó, có thể là Chrom [e | ium], FF, Safari sau đó) đang đẩy về phía hỗ trợ đa xử lý (thông qua công nhân). Bạn có thể kiểm tra thêm về điều đó here.

+0

@alexandernst kể từ khi bạn báo giá [ JavaScript có được đảm bảo là đơn luồng không?] (Http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded?rq=1) câu hỏi tôi sẽ tự hỏi nếu bạn muốn xem xét lại câu lệnh "AFAIK [...] xử lý mọi thứ (có nghĩa là, điền vào hàng đợi và chạy, ** từng dòng **, bất kỳ mã JS nào)"? Cụm từ là ** gọi lại ngay lập tức ** như được đề cập một cách khôn ngoan trong [câu trả lời đầy đủ của câu hỏi này] (http://stackoverflow.com/a/2734311/1711186). Bạn nghĩ sao? – humanityANDpeace

+0

@humanityANDpeace Thật vậy đó là một điều thú vị.Tôi không thực sự chắc chắn làm thế nào chính xác mỗi trình duyệt sẽ xử lý một tình huống mà bạn đang chạy một khối mã thực sự dài và gọi lại ngay lập tức được bắn. Dù sao, một điều tôi có thể đảm bảo với bạn: nếu bạn tiếp tục trên khái niệm này, nó sẽ phản tác dụng, được đảm bảo. JS không phải là tâm để chạy bất kỳ loại/loại đa luồng/đa xử lý/đa bất cứ điều gì. – alexandernst

+0

@alexandernst Tôi đã kiểm tra thêm. Sử dụng firefox Tôi có thể tái tạo hành vi "không hữu ích" của ** callbacks/events ngay lập tức ** khi tôi sử dụng 'alert()' để tạm dừng một số thực thi. Tôi vẫn tự hỏi nếu đây chỉ là một lỗi của firefox. Bạn đã sẵn sàng để đọc các thông số kỹ thuật để biết những gì "nên" là cách xử lý đồng thời? – humanityANDpeace

Các vấn đề liên quan