2013-08-05 47 views

Trả lời

29

Không hoàn toàn. Câu hỏi thường gặp về Go Why goroutines instead of threads? giải thích:

Goroutines là một phần của việc đồng thời dễ sử dụng. Ý tưởng, vốn đã tồn tại trong một thời gian, là ghép các chức năng thực thi độc lập — coroutines — vào một tập hợp các luồng.Khi một khối coroutine, chẳng hạn như bằng cách gọi một cuộc gọi hệ thống chặn, thời gian chạy sẽ tự động di chuyển các coroutines khác trên cùng một luồng hệ điều hành đến một luồng khác, có thể chạy được để chúng không bị chặn. Lập trình viên không thấy điều này, đó là vấn đề. Kết quả, mà chúng ta gọi là goroutines, có thể rất rẻ: trừ khi chúng tốn nhiều thời gian trong các cuộc gọi hệ thống dài, chúng tốn ít hơn bộ nhớ cho stack, mà chỉ là vài kilobyte.

Để tạo các ngăn xếp nhỏ, thời gian chạy của phân đoạn của Go sử dụng phân đoạn ngăn xếp. Một goroutine mới được đúc được cho một vài kilobyte, hầu như luôn luôn là đủ. Khi không, thời gian chạy sẽ phân bổ (và giải phóng) các phân đoạn tiện ích tự động. Chi phí trung bình trên ba hướng dẫn giá rẻ cho mỗi cuộc gọi hàm. Nó là thực tế để tạo ra hàng trăm ngàn goroutines trong cùng một không gian địa chỉ. Nếu goroutines chỉ là chủ đề, tài nguyên hệ thống sẽ chạy với số lượng nhỏ hơn nhiều.

2

Goroutine là một "chuỗi" thực thi riêng biệt. Đó là IMO không thực sự so sánh với một coroutine. Trong xấp xỉ đầu tiên, các goroutine có thể được thực hiện bởi các chủ đề OS thực. AFAIK, đó là trường hợp của phiên bản đầu tiên của gccgo. Một sự khác biệt là goroutines có thể được ưu tiên.

Trình biên dịch Go hiện tại triển khai goroutines dưới dạng không gian người dùng rất "không gian". Một tính năng khác biệt wrt để ví dụ. green threads là các goroutine có thể chuyển sang các chuỗi hệ điều hành khác nhau.

Tôi nghĩ bạn có thể tìm thấy một số bit liên quan quan tâm ở đây: proc.c

+0

'preempted' có nghĩa là gì? –

+0

@ Sławosz: Xem http://en.wikipedia.org/wiki/Preemption_(computing). Trong ngắn hạn, có lịch trình hợp tác (coroutines, năng suất, ...) và preemptive lập kế hoạch (hệ điều hành chủ đề, goroutine, ...) – zzzz

+1

Tôi không tin rằng goroutines được preemptively theo lịch trình. Tôi nghĩ rằng goroutines chỉ có những điểm nhất định mà tại đó họ kiểm tra bằng trình lên lịch cho một công tắc ngữ cảnh có thể có (ví dụ: tại các cuộc gọi hàm, tại i/o, v.v.). – weberc2

3

Cho dù một goroutine là một coroutine đúng hay chỉ là một cái gì đó tương tự thường được thảo luận trên https://groups.google.com/forum/?fromgroups=#!forum/golang-nuts. Một số người có thể tranh luận về sự tinh tế như vậy, nhưng đối với hầu hết nó: goroutine là một coroutine.

Hãy xem https://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw/edit để hiểu cách trình lập lịch hoạt động.

37

IMO, một coroutine ngụ ý hỗ trợ rõ ràng có nghĩa là để chuyển quyền kiểm soát cho một coroutine khác. Đó là, các lập trình viên một chương trình coroutine theo một cách khi họ quyết định khi một coroutine nên đình chỉ thực hiện và vượt qua kiểm soát của nó để coroutine khác (hoặc bằng cách gọi nó hoặc trả lại/thoát (thường được gọi là năng suất)).

"goroutines" Go là một điều: họ ngầm kiểm soát đầu hàng tại một số không xác định điểm đó xảy ra khi goroutine sắp ngủ trên một số tài nguyên (bên ngoài) như I/O hoàn thành, kênh gửi Cách tiếp cận này kết hợp với trạng thái chia sẻ thông qua các kênh cho phép lập trình viên viết logic chương trình như một tập hợp các quy trình trọng lượng nhẹ tuần tự loại bỏ vấn đề mã spaghetti chung cho cả hai phương pháp tiếp cận dựa trên sự kiện và coroutine. Về việc triển khai, tôi nghĩ rằng chúng khá giống với (không may là không nổi tiếng) "State Threads" library, chỉ khá cấp thấp hơn (như Go không dựa trên libc hoặc những thứ như thế này và nói chuyện trực tiếp với Hệ điều hành hạt nhân) — bạn có thể đọc các giấy giới thiệu cho các thư viện ST, nơi khái niệm này là khá tốt giải thích.


Trong thực tế, những điểm này ít quyết tâm hơn so với coroutines nhưng quyết tâm hơn với chủ đề OS đúng trong preemptive multitasking, trong đó mỗi chủ đề có thể bị đình chỉ bởi hạt nhân tại bất kỳ thời điểm nào và ở dòng chảy của điều khiển của luồng.

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