JavaScript đa luồng


10

Ngày nay, JavaScript là trình phát chính trong tất cả các công nghệ phát triển web, về phía máy khách để làm cho giao diện người dùng tốt hơn, logic phía máy khách, trên một số máy chủ web cũng như logic phía máy chủ

Thêm vào đó là thực tế mọi người (ít nhất là một số trong số họ) bắt đầu chuyển sang phát triển trò chơi web từ flash sang javascript và HTML5

Không phải là lúc để nó hỗ trợ đa luồng! Có trình duyệt nào cho phép JavaScript đa luồng hay có ở bất kỳ tiêu chuẩn, HTML5 hay phiên bản nào trong tương lai không?!


1
Mọi người không làm những việc không bắt buộc. Những người đã đóng góp trong thiết kế Javascript, cũng là những người có liên quan đến máy chủ web và trình duyệt đang được phát triển để họ biết về nó. Đó là tất cả về tiện ích.
Dipan Mehta

Câu trả lời:


9

Đa luồng sẽ không được thực hiện trong EcmaScript nhưng có thể được hiển thị trong môi trường máy chủ.

Các ví dụ kinh điển là WebWorkers cho phép bạn tạo ra một nhân viên nền để thực hiện công việc và lạm dụng <iframe>như một cách để tạo ra các quy trình mới.

Cần lưu ý rằng không cần đa luồng trong JavaScript (có các trường hợp ngoại lệ, chủ yếu là các chương trình liên quan đến đồ họa). Bạn không cần nhiều luồng, bạn đã có một vòng lặp sự kiện cho GUI của bạn và kết xuất đồ họa (canvas) của bạn được tăng tốc phần cứng (có nghĩa là GPU kết xuất đồ họa của bạn song song với bạn).

Mặc dù các dự án như webcl là khá thú vị.


2
Bạn có thể mở rộng trên thực tế rằng nó "không cần thiết"? Gần đây tôi đã gặp một trường hợp trong đó trường hợp tự nhiên trong lập trình máy tính để bàn sẽ tạo ra một luồng để xử lý tác vụ nhưng rõ ràng đó không phải là một lựa chọn dễ dàng hoặc tiêu chuẩn. Tôi đã làm việc xung quanh trường hợp đó nhưng sinh ra một chủ đề dường như là giải pháp thanh lịch hơn.
Giàn

@rig trường hợp bạn đang cố gắng xử lý là gì?
Zachary K

@Rig đưa ra một ví dụ cụ thể. Xử lý tốn kém về mặt tính toán là rất hiếm trong JavaScript phía máy khách
Raynos

@Raynos vui lòng giải thích thêm về việc không cần thiết như thế nào
Ali

@Ali Tôi đã xử lý và nói rằng có những ngoại lệ. Tuy nhiên, phần lớn tính toán nặng nề đó nên được trao cho GPU thông qua API đồ họa được tăng tốc phần cứng
Raynos

4

KHÔNG

Đa luồng là một trong những điều khó nhất trong phần mềm. Có quá nhiều trường hợp góc thực sự khó xử lý khi mã của bạn không mang tính quyết định. (Tôi đang nói về đa luồng với ổ khóa, v.v.). Ngoài ra, tất cả các thư viện JavaScript khác nhau đều được xây dựng dựa trên giả định rằng nó không đa luồng.

Điều đó đang được nói rằng có những nhân viên web cung cấp cho bạn một khung dựa trên diễn viên để thực hiện nhiều loại hoạt động xử lý. Bạn có thể tạo công nhân và truyền dữ liệu qua lại thông qua các sự kiện.

EDIT: Lý do khác là khi JavaScript được tạo, nó đã được thực hiện với giả định nó sẽ được sử dụng cho các tác vụ nhỏ, do đó không có đồng thời nào được tích hợp. Để trang bị thêm nó sẽ phá vỡ rất nhiều mã. Bằng cách thêm nhân viên web, có thể có một hệ thống đồng thời không có bộ nhớ chia sẻ, nhưng bằng cách sử dụng các tác nhân, một mô hình tương tranh đã thể hiện rất mạnh mẽ trong một số ngôn ngữ khác như Erlang, Scala, Clojure Vân vân.

(NẾU bạn không thể nói tôi thực sự không thích đồng thời dựa trên khóa)


1
Multi threading is one of the hardest things in software to get right.- tôi chỉ ngạc nhiên với điều này! Trình duyệt bạn đang sử dụng, HĐH của máy tính để bàn, máy chủ web phục vụ trang này - thực tế mọi ứng dụng bạn sử dụng hàng ngày đều là đa luồng. BẠN CÓ PHẢI LÀ Ý NGH ITA KHÔNG? Chưa hạ bệ bạn, nhưng tôi sẽ làm nếu bạn nóimultithreading is not done because it is hard
Dipan Mehta

3
@DipanMehta đa luồng một trong những điều khó nhất trong phần mềm để có được quyền. Lý do tất cả những ứng dụng đó sử dụng là vì chúng được viết bởi những người thực sự tài năng
Raynos

@Raynos - trời đất ơi! Vì vậy, bạn đang gọi tôi tài năng! Tôi sử dụng nó hàng ngày ... tôi nghĩ khi bạn lập trình C hoặc bất kỳ ứng dụng quy mô lớn nào, nó khá phổ biến. Vấn đề là, bất kể việc sử dụng và yêu cầu, tập đoàn W3C đã không thực sự bỏ qua nó cho Javascript vì nó quá khó !
Dipan Mehta

2
Việc bạn nhấn mạnh một cách nghiêm túc việc viết các chương trình song song chính xác và hiệu quả là khó khăn như thế nào. Nhưng đa luồng không có trong JavaScript vì độ phức tạp không cần thiết của nó (điều được viết trong 3 tuần)
Raynos

2
@DipanMehta nhận được một khóa đồng thời dựa trên khóa được thực hiện đúng, và đóng đinh tất cả các trường hợp góc là một vấn đề khó khăn. Ví dụ, việc thực hiện một cái gì đó đơn giản như một hàng đợi với các khóa có thể được chứng minh là đúng trong mọi trường hợp sẽ là kết quả có thể xuất bản cho đến vài năm trước. Nhưng quan trọng hơn là cố gắng cải thiện điều đó lên một ngôn ngữ chưa có nó đang gây rắc rối.
Zachary K

3

mở javascript lên để đa luồng sẽ tạo ra nhiều vấn đề hơn nó giải quyết:

kiến trúc hiện tại là dựa trên sự kiện đơn luồng (chạy trong luồng gui thường xuyên hơn không) nói cách khác với mọi khối mã bạn có thể yên tâm rằng không có gì trong môi trường sẽ thay đổi từ đầu đến cuối trừ những gì được thay đổi trong mã.

ngay khi bạn cho phép thực hiện quyền ưu tiên hoặc thực thi song song, tính năng này sẽ biến mất, điều này có nghĩa là bạn cần áp dụng các khóa cho dữ liệu mà bạn muốn thay đổi cộng với việc khó gỡ lỗi các điều kiện cuộc đua để tránh

có thể thực hiện song song giả bằng cách sử dụng thời gian chờ, điều này có nghĩa là tách các chức năng chạy lớn hoặc dài thành các khối nguyên tử và sử dụng setTimeout(function(){nextstep(args);},1);để các công cụ khác có thể chạy nếu cần


0

Intel đã phát hành River Trail một thời gian trước, cho phép lập trình song song trong Javascript. Tuy nhiên, đó là một plugin chỉ dành cho Firefox và tôi chưa nghe nói về một lộ trình đưa công nghệ này vào W3C, ít hơn ECMA.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.