2013-07-09 30 views
5

Tôi đã nghe loại tuyên bố này nhiều lần, nhưng cá nhân tôi nghĩ rằng điều này không hoàn toàn hợp lý. Tôi nghĩ mọi người đang nhầm lẫn JavaScript là một đặc tả ngôn ngữ và JavaScript trong thực tế (trình duyệt, Node, v.v.). Tất nhiên trong hầu hết các trường hợp, JavaScript được thực hiện trong môi trường một luồng; nhưng AFAIK không có gì trong đặc tả ngôn ngữ yêu cầu nó phải như vậy. Tôi nghĩ rằng điều này cũng giống như nói rằng Python được "diễn dịch", trong khi đó thực tế là vấn đề thực hiện.Có chính xác khi nói JavaScript là ngôn ngữ "một chủ đề" không?

Vì vậy, có chính xác khi nói JavaScript là ngôn ngữ "một chuỗi" không?

+0

Điều này có thể có liên quan http://stackoverflow.com/questions/30036/javascript-and-threads Tôi đoán không có gì trong chính ngôn ngữ đó sẽ vô hiệu hóa bạn khi tạo trình thông dịch đa luồng – fsw

Trả lời

2

Hành vi đa luồng có sẵn trong cả HTML5 và node.js, NHƯNG không có API luồng gốc trong ngôn ngữ Javascript, vì vậy tôi đoán câu trả lời cho câu hỏi có ý nghĩa của bạn (ý tôi là theo cách tốt nhất có thể, tất nhiên) là "có, Javascript là một ngôn ngữ đơn luồng."

6

Bằng JavaScript, bạn có vẻ là ECMAScript.

Đã có đa luồng trong trình duyệt, được xây dựng với webworkers và dựa trên sự cô lập dữ liệu mạnh mẽ: công nhân chỉ giao tiếp bằng cách gửi tin nhắn, không có gì được chia sẻ.

Nếu bạn muốn đa luồng phức tạp hơn, với chia sẻ dữ liệu, thì hiện tại không thể xem được. Không có gì trong ECMAScript explicitely cấm đa luồng nhưng bạn không thể làm mà không multithreading

  • cơ sở vật chất để tạo ra "chủ đề" (theo nghĩa chung, đó có thể coroutines)
  • mutexes và cơ sở vật chất đồng bộ truy cập
  • một hỗ trợ mức thấp để đảm bảo ví dụ thay đổi thuộc tính sẽ không phá vỡ dữ liệu trong trường hợp truy cập đồng thời. Không có động cơ hiện tại nào được thiết kế với loại cường độ này (có, một vài trong số chúng hỗ trợ nhiều luồng nhưng trong sự cô lập).

Thực tế ECMAScript không được thiết kế để bao gồm đa luồng là đủ để ngăn chặn, hiện tại, để hỗ trợ nó (khác hơn là truyền thông điệp bị cô lập đa luồng như đã được thực hiện nhưng đó là một loại rất hạn chế của đa luồng).

Bạn phải nhận ra rằng

  • chia sẻ dữ liệu đa luồng là rất tốn kém (thậm chí không nói về những hành động đồng thời trên DOM)
  • bạn sẽ hiếm khi sử dụng nó trong JavaScript

Tại sao tôi nói bạn hiếm khi sử dụng nó? Bởi vì hầu hết các tác vụ chặn IO (đọc tệp, yêu cầu, truy vấn db, v.v.), hầu hết các tác vụ ở mức thấp (ví dụ giải mã hình ảnh hoặc hiển thị trang), hầu hết quản lý giao diện người dùng (với hàng đợi sự kiện), hầu hết lập kế hoạch (thời gian chờ và khoảng thời gian) được thực hiện bên ngoài cho bạn.

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