2012-01-24 23 views
6

Chức năng sau có bị chặn trên lõi đang chạy không?ERLANG chờ() và chặn

Câu trả lời tuyệt vời sẽ trình bày chi tiết công việc nội bộ của erlang và/hoặc CPU.

wait(Sec) -> 
    receive 
    after (1000 * Sec) -> ok 
    end. 

Trả lời

7

Quá trình mà thực hiện mà khối mã sẽ, chức năng lịch chạy quá trình hiện sẽ không khối. Mã bạn đăng tương đương với sản lượng nhưng với thời gian chờ.

Trình lập lịch biểu Erlang VM cho lõi đó sẽ tiếp tục thực hiện các quy trình khác cho đến khi hết thời gian chờ và quá trình đó sẽ được lên lịch để thực hiện lại.

+0

Có tương đương erlang của 'setTimeout' của NodeJS không? Nó không bị chặn cho luồng hiện tại – CMCDragonkai

+0

@CMCDragonkai: Bạn có thể chặn nhận ngay bây giờ (có hoặc không có thời gian chờ), hoặc bạn không. Bạn có thể lên lịch làm việc giữa các cuộc gọi 'receive' bằng cách đặt thời gian chờ thành' 0'. Điều này về cơ bản có nghĩa là kiểm tra hộp thư đến của bạn và tiếp tục công việc nếu nó trống. Bạn cũng có thể lên lịch kiểm tra nâng cao hơn bằng cách sử dụng ví dụ ['send_after/3'] (http://erlang.org/doc/man/erlang.html#send_after-3). –

2

Câu trả lời ngắn gọn: điều này sẽ chỉ chặn quy trình hiện tại (trọng lượng nhẹ) và sẽ không chặn tất cả VM. Để biết thêm chi tiết, bạn phải đọc về lịch trình erlang. Mô tả hay xuất phát từ cuốn sách "Lập trình đồng nhất" của Francesco Cesarini và Simon Thompson.

... snip ... Khi một quá trình là phái, nó được gán một số giảm † nó được phép thực hiện, một số được giảm cho mỗi hoạt động thực thi. Ngay sau khi quá trình nhập khoản tiền nhận trong đó không có thông báo nào phù hợp hoặc số lượng giảm của nó đạt đến số bằng không, nó được đặt trước. Miễn là BIF không được thực thi, kết quả chiến lược này là sự phân bổ công bằng (nhưng không bằng nhau) thực hiện thời gian giữa các quá trình. ... snip ...

1

không có vấn đề gì cụ thể về Erlang, khá cổ điển: thời gian chờ chỉ có thể xảy ra khi ngắt hệ thống. Câu trả lời tương tự như trên: quá trình đó bị chặn chờ đợi cho ngắt đồng hồ, mọi thứ khác chỉ hoạt động tốt. Có một cuộc thảo luận khác về thời gian thực tế mà quá trình chờ đợi không chính xác vì nó phụ thuộc vào thời gian đồng hồ (và phụ thuộc vào hệ thống) nhưng đó là một chủ đề khác.

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