2009-02-16 68 views
97

coroutine là gì? Chúng liên quan đến sự tương tranh như thế nào?coroutine là gì?

+0

đang đồng thời không có nhất thiết phải chạy trong "song song" (không giới thiệu các thuật ngữ mới). – user1712447

+0

Tôi đã viết một thư viện coroutine với chuẩn C, hỗ trợ các tin nhắn chọn/poll/eplll/kqueue/iocp/Win GUI cho Linux, BSD và Windows. Đó là một dự án mã nguồn mở trong https://github.com/acl-dev/libfiber. Lời khuyên sẽ được chào đón. –

Trả lời

80

Coroutines và đồng thời phần lớn là trực giao. Coroutines là một cấu trúc điều khiển chung trong đó kiểm soát dòng chảy được hợp tác thông qua giữa hai thói quen khác nhau mà không quay trở lại.

Câu lệnh 'yield' trong Python là một ví dụ tốt. Nó tạo ra một coroutine. Khi 'yield' gặp phải trạng thái hiện tại của hàm được lưu và điều khiển được trả về hàm gọi. Chức năng gọi điện sau đó có thể chuyển thực hiện trở lại chức năng năng suất và trạng thái của nó sẽ được khôi phục đến điểm mà 'lợi nhuận' đã gặp phải và việc thực thi sẽ tiếp tục.

+9

Sự khác biệt giữa việc gọi một hàm trực tiếp và năng suất từ ​​một coroutine với gói hàm này vào coroutine này là gì? –

+1

Nó có thể là tốt hơn để giải thích rằng hai khái niệm này không thực sự 'trực giao' trong bối cảnh này sau đó. Bạn chắc chắn có thể vẽ cách hai khái niệm tương tự nhau. Ý tưởng vượt qua kiểm soát giữa hai hay nhiều thứ là rất giống nhau. – steviejay

29

Từ Programming in Lua, "Coroutines" phần:

Một coroutine là tương tự như một sợi (theo nghĩa đa luồng): nó là một dòng thi công, với stack riêng của mình, biến cục bộ của riêng mình, và con trỏ chỉ dẫn của nó; nhưng nó chia sẻ các biến toàn cầu và chủ yếu là bất cứ điều gì khác với các coroutines khác. Sự khác biệt chính giữa các luồng và coroutines là, theo khái niệm (hoặc theo nghĩa đen, trong một máy đa xử lý), một chương trình với các luồng chạy một số luồng song song. Coroutines, mặt khác, là hợp tác: tại bất kỳ thời điểm nào, một chương trình với coroutines đang chạy chỉ một trong những coroutines của nó, và coroutine chạy này đình chỉ thực hiện của nó chỉ khi nó yêu cầu một cách rõ ràng bị đình chỉ.

Vì vậy, vấn đề là: Coroutines là "cộng tác". Ngay cả trong hệ thống đa lõi, chỉ có một coroutine chạy tại bất kỳ thời điểm nào (nhưng nhiều luồng có thể chạy song song). Không có sự ưu tiên giữa coroutines, coroutine đang chạy phải từ bỏ việc thực thi một cách rõ ràng.

Đối với "concurrency", bạn có thể tham khảo Rob Pike của slide:

Concurrency là các thành phần của phép tính thực hiện một cách độc lập.

Vì vậy, trong quá trình thực coroutine A, nó chuyển điều khiển đến coroutine B. Sau đó, sau một thời gian, các coroutine B chuyển điều khiển trở lại coroutine A. Vì không phụ thuộc giữa coroutines, và họ phải chạy song song, vì vậy hai coroutines là không đồng thời.

+0

Tôi đã yêu câu trả lời này cho đến khi tôi nhận được câu cuối cùng. Nó có nghĩa là gì? Bạn đã sai chính tả "đồng thời"? Nếu vậy, kết luận đó dường như không khớp với định nghĩa được cung cấp. Hay đó có nghĩa là một từ mới "concurreny"? Chữ đó có nghĩa là gì? –

+0

@ ErickG.Hagstrom: Xin lỗi, tôi đã viết sai chính tả 'concurrency'. Tại sao bạn nghĩ rằng kết luận dường như không khớp với định nghĩa được cung cấp? –

+0

Coroutines không thực thi độc lập. Họ thay phiên nhau, mỗi người chờ người khác làm một phần công việc. Họ chủ động phối hợp với nhau. Điều ngược lại với định nghĩa của Rob Pikes về sự tương tranh. –

6

Coroutine tương tự như chương trình con/chủ đề. Sự khác biệt là khi người gọi đã gọi ra một chương trình con/luồng, nó sẽ không bao giờ quay trở lại hàm người gọi. Nhưng một coroutine có thể quay trở lại người gọi sau khi thực hiện một đoạn mã cho phép người gọi thực thi một số mã riêng của mình và quay trở lại điểm coroutine nơi nó dừng thực hiện và tiếp tục từ đó. tức là. Một coroutine có nhiều hơn một điểm xuất nhập cảnh

1

Trên một lưu ý khác nhau, trong python gevent thư viện là một thư viện dựa coroutine mạng đó cung cấp cho bạn các tính năng nhỏ như sợi chỉ như các yêu cầu mạng async, mà không có sự cần thiết của việc tạo ra và phá hủy bài. Thư viện coroutine được sử dụng là greenlet.

0
  • coroutines là tính năng tuyệt vời có sẵn trong Kotlin Ngôn ngữ
  • coroutines được một phương pháp mới để viết không đồng bộ, non-blocking mã (và nhiều hơn nữa)
  • coroutine là chủ đề trọng lượng nhẹ. Chủ đề trọng lượng nhẹ có nghĩa là không ánh xạ trên chuỗi gốc, do đó, nó không yêu cầu chuyển ngữ cảnh trên bộ xử lý, vì vậy chúng nhanh hơn.
  • bản đồ không được vẽ trên chủ đề gốc
  • Coroutines và chủ đề đều đa nhiệm. Nhưng sự khác biệt là chủ đề được quản lý bởi hệ điều hành và coroutines bởi người dùng.

Về cơ bản, có hai loại coroutines:

  1. Stackless
  2. Stackful

Kotlin thực hiện coroutines Stackless - nó có nghĩa là coroutines không có ngăn xếp riêng, để họ không ánh xạ trên chuỗi gốc.

Đây là những chức năng để bắt đầu coroutine:

launch{} 

async{} 

Bạn có thể tìm hiểu thêm tại đây:

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9