2012-01-22 26 views
29

cho phép nói về mã JavaScript có các phương pháp setInterval mỗi 2 giây.Lập trình không đồng bộ có nghĩa là đa luồng không?

Tôi cũng có một sự kiện hoạt ảnh onblur để kiểm soát một số.

Trong trường hợp xảy ra onblur (+ hoạt ảnh), tôi có thể nhận được chức năng setInterval.

Vì vậy, câu hỏi của tôi là:
Chương trình không đồng bộ có nghĩa là đa luồng không? (theo bất kỳ cách nào?)

Tôi biết rằng Javascript không phải là ngôn ngữ đa luồng.

Vậy ...?

+3

Không, asynchronicity (ism?) Không * không * yêu cầu song song. –

+0

dưới bìa có chủ đề, nhưng như là một người lập trình/ngôn ngữ người tiêu dùng nó không. – Jason

+2

@ Jason không có chủ đề nào nằm trong trang bìa. Hoặc ít nhất là không cần phải thế. – Raynos

Trả lời

62

No. Điều đó có nghĩa là ý nghĩa của nó-- không đồng bộ. Hiểu được sự khác biệt giữa lập trình không đồng bộ và lập trình dựa trên luồng là rất quan trọng đối với sự thành công của bạn với tư cách là một lập trình viên.

Trong môi trường truyền thống, không phải luồng, khi chức năng phải đợi sự kiện bên ngoài (chẳng hạn như sự kiện mạng, sự kiện bàn phím hoặc chuột hoặc thậm chí là sự kiện đồng hồ), chương trình phải chờ cho đến khi sự kiện xảy ra.

Trong môi trường nhiều luồng, nhiều luồng lập trình riêng lẻ đang chạy cùng một lúc. (Tùy thuộc vào số lượng CPU và sự hỗ trợ của hệ điều hành, điều này có thể đúng theo nghĩa đen, hoặc nó có thể là ảo tưởng được tạo ra bởi các thuật toán lập lịch trình phức tạp).Vì lý do này, môi trường đa luồng rất khó và liên quan đến các vấn đề của các luồng khóa bộ nhớ của nhau để ngăn chúng tràn ngập nhau.

Trong môi trường không đồng bộ, một luồng xử lý đơn lẻ sẽ chạy mọi lúc, nhưng có thể vì lý do hướng sự kiện (và đó là khóa), chuyển từ một hàm này sang hàm khác. Khi sự kiện xảy ra, và khi quá trình hiện đang chạy đạt đến điểm cần phải đợi sự kiện khác, lõi javascript sau đó quét danh sách sự kiện và phân phối sự kiện tiếp theo, trong (không chính thức) không xác định (nhưng có thể xác định) cho người quản lý sự kiện.

Vì lý do này, lập trình theo hướng sự kiện, không đồng bộ tránh được nhiều cạm bẫy của chương trình đa luồng, truyền thống, chẳng hạn như các vấn đề tranh luận về bộ nhớ. Vẫn có thể có các điều kiện chủng tộc, vì thứ tự các sự kiện được xử lý không tùy thuộc vào bạn, nhưng chúng hiếm và dễ quản lý hơn. Mặt khác, bởi vì trình xử lý sự kiện không cung cấp các sự kiện cho đến khi hàm hiện đang chạy chạm vào một vị trí nhàn rỗi, một số chức năng có thể bỏ đói phần còn lại của chương trình. Điều này xảy ra trong Node.js, ví dụ, khi mọi người ngu ngốc thực hiện rất nhiều phép toán nặng trong máy chủ-- đó là tốt nhất đẩy vào một máy chủ nhỏ mà nút sau đó "chờ đợi" để cung cấp câu trả lời. Node.js là một tổng đài nhỏ tuyệt vời cho các sự kiện, nhưng bất cứ điều gì mất nhiều thời gian hơn 100 mili giây sẽ được xử lý theo cách của máy khách/máy chủ. Trong môi trường trình duyệt, các sự kiện DOM được coi là các điểm sự kiện tự động (chúng phải là, thay đổi DOM mang lại nhiều sự kiện), nhưng ngay cả Javascript có thể làm hỏng lõi, đó là lý do tại sao cả Firefox và Chrome có những "tập lệnh này đã ngừng phản hồi" các trình xử lý ngắt.

+1

Còn về cuộc gọi ajax trong jQuery, mã phía máy chủ thực hiện công cụ của nó trong khi trình duyệt của tôi vẫn giữ các chức năng khác .....? –

+6

Đó không phải là chủ đề. Bạn đã gửi một tin nhắn trong mã trình duyệt của bạn đến máy chủ. * Khi cuộc gọi trả về * là một sự kiện và mã của bạn được dự kiến ​​sẽ nhặt nó lên và làm điều gì đó với nó. Trong khi nó chờ đợi, eventloop đi để xử lý các sự kiện khác. Khi sự kiện của bạn quay trở lại, eventloop cho phép điều khiển hoàn toàn gọi lại của bạn về chuỗi quy trình duy nhất cho đến khi bạn từ bỏ kết thúc cuộc gọi lại, thực hiện điều gì đó khiến sự kiện phát triển hoặc tạo sự kiện mới. –

+5

một câu trả lời tuyệt vời, cảm ơn vì đã giải thích rằng theo cách hợp lý, miễn phí – Jason

0

Chỉ theo nghĩa là nó thực thi mã ngẫu nhiên và rủi ro trong điều kiện chủng tộc. Bạn sẽ không nhận được bất kỳ lợi ích hiệu suất nào từ việc sử dụng hết thời gian chờ và khoảng thời gian.

Tuy nhiên, WebWorkers HTML5 của ta cho phép xử lý đa luồng thực trong trình duyệt: http://www.html5rocks.com/en/tutorials/workers/basics/

5

Một ren vòng lặp sự kiện duy nhất là một ví dụ tốt về việc không đồng bộ trong một ngôn ngữ đơn luồng.

Khái niệm ở đây là bạn đính kèm doLater trình xử lý gọi lại đến eventLoop. Sau đó, eventLoop chỉ là một while(true) kiểm tra xem dấu thời gian cụ thể cho mỗi trình xử lý doLater có được đáp ứng hay không và nếu có thì trình xử lý đó sẽ xử lý.

Đối với những người quan tâm, đây là một thực hiện ngây thơ (và khủng khiếp không hiệu quả đồ chơi) của một single threaded event loop in JavaScript

này có nghĩa rằng nếu không có bất kỳ loại hệ điều hành truy cập bai Scheduler của chủ đề duy nhất của bạn, bạn buộc phải chờ đợi bận rộn trên doLater gọi lại.

Nếu bạn có cuộc gọi sleep, bạn chỉ có thể thực hiện cho đến khi xử lý doLater tiếp theo hiệu quả hơn sau đó chờ đợi quá lâu.

-3

Nếu có một cuộc gọi lại, một cái gì đó phải gọi nó. Các đơn vị thực hiện là các luồng & vì vậy, có, một số luồng khác phải gọi lại gọi lại, hoặc trực tiếp hoặc bằng cách xếp hàng một số cuộc gọi thủ tục không đồng bộ đến chuỗi khởi tạo.

+0

Hoàn toàn có thể cho _same thread_ duy nhất để gọi lại sau. – Raynos

+0

@Raynos như thế nào? Nếu một chuỗi trực tiếp gọi một hàm, nó chỉ được gọi là 'cuộc gọi'. Nếu cuộc gọi lại được báo hiệu vào luồng trên một số vòng lặp đầu vào, một thứ gì đó phải xếp hàng đợi gọi lại. Một trình điều khiển có thể làm điều này trực tiếp, nhưng nó thường là một luồng hạt nhân. –

+0

Bằng cách có toàn bộ vòng lặp sự kiện trực tiếp trong chuỗi đơn. Lưu ý rằng các thread không thể làm bất kỳ IO sau đó, nó chỉ có thể làm giao tiếp không đồng bộ với chính nó và bất cứ điều gì trong thread duy nhất. Điều này có thể là đạo đức. – Raynos

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