Trong bản trình bày Google I/O 2012 Go Concurrency Patterns, Rob Pike đề cập rằng một số goroutines có thể tồn tại trong một chuỗi. Điều này có nghĩa là chúng được triển khai dưới dạng coroutines? Nếu không, chúng được thực hiện như thế nào? Liên kết đến mã nguồn sẽ được chào đón.Là một goroutine Go một coroutine?
Trả lời
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.
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
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.
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.
- 1. coroutine là gì?
- 2. Tại sao sử dụng kênh không bị chặn trong cùng một goroutine cho một bế tắc
- 3. Tại sao time.sleep lại cần thiết để chạy một số goroutine?
- 4. Cách tạo kênh nhận nhiều giá trị trả lại từ một goroutine
- 5. Go - Điều gì thực sự là một multipart.File?
- 6. Golang goroutine không chạy với kênh bên trong
- 7. Coroutine vs Continuation vs Generator
- 8. Sự khác biệt giữa "coroutine" và "thread"?
- 9. Boost coroutine khẳng định thất bại
- 10. Gọi một phương pháp từ một Go mẫu
- 11. Chuyển đổi một dấu lớn thành một chuỗi trong Go
- 12. In ấn để stdout khiến goroutine bị chặn chạy?
- 13. Có thể đợi cả hai kênh và các bộ mô tả tập tin cùng một lúc trong Go?
- 14. "..." có nghĩa là gì khi bên cạnh một tham số trong khai báo hàm go?
- 15. Lỗi (. Os.PathError) trong Go là gì?
- 16. phát Python, không nuốt ngoại lệ trong 'coroutine'
- 17. Go: Một nhà sản xuất nhiều người tiêu dùng
- 18. Lưu một đối tượng trong memcache của GAE trong Go
- 19. Nhiều thẻ trên cùng một thành viên cấu trúc Go
- 20. Khi nào cần xóa một tệp trong Go?
- 21. Làm thế nào để ống một số lệnh trong Go?
- 22. Ánh xạ một mảng vào một tệp qua Mmap trong Go
- 23. Kiểm tra xem một lát chuỗi có chứa một giá trị nhất định trong Go
- 24. Đảm bảo một loại thực hiện một giao diện tại thời gian biên dịch trong Go
- 25. How Do I Phân tích một tệp JSON thành một cấu trúc với Go
- 26. Vai trò của cú pháp "interface {}" trong Go là gì?
- 27. Làm thế nào tôi có thể khởi động một quá trình mà không phải là một tập tin trong Go (ví dụ như mở một trang web)
- 28. "./..." trong "go install./..." có nghĩa là ngôn ngữ đi?
- 29. Tương đương với argv [0] của Go là gì?
- 30. Điều "foo. (Bar.Baz)" này trong mã Go là gì?
'preempted' có nghĩa là gì? –
@ 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
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