2011-09-13 46 views
8

Đây là một thuật ngữ tôi thấy một lần nữa và một lần nữa khi đề cập đến các ngôn ngữ xử lý thời gian thực. Trong trường hợp cụ thể này, tôi đang đọc trang chủ node.js và nó có trích dẫn này:Chức năng chặn là gì?

"Trong các hệ thống khác luôn có cuộc gọi chặn để bắt đầu vòng lặp sự kiện."

Cuộc gọi chặn là gì?

Trả lời

13

Một chức năng dừng thực thi tập lệnh cho đến khi nó kết thúc.

Ví dụ, nếu tôi có một hàm trong ngôn ngữ của tôi đã được sử dụng để viết thư cho một tập tin, như vậy:

fwrite(file, "Contents"); 
print("Wrote to file!"); 

Tuyên bố print sẽ chỉ được thực hiện khi các tập tin đã được ghi vào đĩa . Toàn bộ chương trình là bị tạm dừng về hướng dẫn này. Đây không phải là đáng chú ý cho nhỏ đủ viết, nhưng hãy tưởng tượng tôi đã có một blob khổng lồ để ghi vào tập tin, một trong những diễn nhiều giây:

fwrite(file, blob); 
print("Wrote to file!"); 

Tuyên bố print sẽ chỉ được thực hiện sau một vài giây của thành văn bản, và toàn bộ chương trình sẽ bị dừng lại trong thời gian đó. Trong Node.js, công cụ này được thực hiện không đồng bộ, sử dụng sự kiệngọi lại. Ví dụ của chúng tôi sẽ trở thành:

fwrite(file, blob, function() { 
    print("Wrote to file!"); 
}); 
print("Do other stuff"); 

Trường hợp tham số thứ ba là hàm được gọi khi tệp đã được ghi. Câu lệnh print được đặt sau khi chức năng ghi sẽ được gọi ngay sau đó, cho dù tệp đã được ghi chưa. Vì vậy, nếu chúng ta viết một blob đủ lớn, sản lượng có thể trông như thế này:

Do other stuff 
Wrote to file! 

Điều này làm cho applictions rất nhanh vì bạn không chờ đợi vào một thông điệp khách hàng, một ghi tập tin hoặc khác. Bạn có thể tiếp tục xử lý dữ liệu theo cách song song. Đây được coi là một trong những thế mạnh của Node.js.

2
var block = function _block() { 
    while(true) { 
    readInputs(); 
    compute(); 
    drawToScreen(); 
    } 
} 

Chức năng chặn về cơ bản sẽ tính toán mãi mãi. Đó là những gì nó có nghĩa là bằng cách ngăn chặn.

chức năng chặn khác sẽ đợi cho IO xảy ra

một hệ thống IO non-blocking nghĩa một hàm bắt đầu một hành động IO, sau đó đi nhàn rỗi sau đó xử lý các kết quả của các hành động IO khi nó xảy ra.

Về cơ bản, đó là sự khác biệt giữa chuỗi không hoạt động và ngủ.

0

Cuộc gọi chặn là cuộc gọi chặn không cho phép xử lý tiếp tục cho đến khi trở về chuỗi cuộc gọi - đây cũng được gọi là cuộc gọi đồng bộ. Mặt khác, không đồng bộ có nghĩa là các luồng (và mã) có thể thực thi cùng một lúc (đồng thời).

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