2009-02-16 59 views
97

什麼是協同程序?它們與併發有什麼關係?什麼是協同程序?

+0

並行代碼不必一定要運行「並行」(我們不要介紹新術語)。 – user1712447 2018-01-30 20:35:46

+0

我已經用標準C編寫了一個協程庫,支持Linux,BSD和Windows的select/poll/eplll/kqueue/iocp/Win GUI消息。這是一個https://github.com/acl-dev/libfiber中的開源項目。建議將是很好的。 – 2018-02-24 15:38:47

回答

80

協程和併發在很大程度上是正交的。協程是一種通用的控制結構,流量控制在兩個不同的例程之間協同傳遞而不返回。

Python中的'yield'語句就是一個很好的例子。它創建了一個協程。當遇到'yield'時,函數的當前狀態被保存並且控制返回到調用函數。調用函數然後可以將執行傳回給yield函數,並且它的狀態將被恢復到遇到'yield'並且執行將繼續的點。

+9

直接調用一個函數和從一個協程產生並將此函數包裝到這個協程中有什麼區別? – 2014-08-04 10:44:00

29

Programming in LuaCoroutines」部分:

甲協程類似於線程(在多線程的有義):它是在執行的線,具有它自己的堆棧,其自己的局部變量,和它自己的指令指針;但它與其他協同程序共享全局變量和大部分其他內容。線程和協程之間的主要區別在於,在概念上(或者在字面上,在多處理器機器中),具有線程的程序並行地運行多個線程。另一方面,協程是協作性的:在任何特定時間,一個帶有協程的程序只運行一個協程,並且這個正在運行的協程只有在明確請求暫停時才暫停執行。

所以問題是:協程是「協作」的。即使在多核系統中,在任何給定時間只有一個協程運行(但多個線程可以並行運行)。在協程之間是非搶先的,運行的協程必須明確放棄執行。

對於 「concurrency」,可以參考羅布派克的slide

併發是獨立地執行的計算的組合物。

所以在協程A的執行,它通過控制一段時間後,再到協程B.,協程B通過控制回協程A.既然有協同程序之間的依賴,他們必須同時運行,所以這兩個協程是不是併發

6

協程類似於子程序/線程。 區別在於一旦調用者調用子程序/線程,它將永遠不會返回到調用者函數。 但是一個協程可以在執行一段代碼後返回給調用者,允許調用者執行一些自己的代碼並返回到協程終點,並停止執行並從那裏繼續執行。 即。一個協同程序有多個入口點和出口點

1

在不同的音符, 在python gevent庫是基於coroutine網絡庫,讓你線狀的功能,比如異步網絡請求,而無需創建和銷燬線程的開銷。使用的庫爲greenlet

0
  • 協程在科特林語言
  • 協同程序提供強大的功能正在編寫異步非阻塞 代碼(以及更多)
  • 協程是輕量線程的新途徑。重量輕的線程意味着它不在本地線程上映射,因此它不需要處理器上的上下文切換 ,因此它們更快。
  • 它不映射在本地線程上
  • 協程和線程都是多任務處理。但差異 是線程由用戶管理的OS和協程。

基本上有兩種類型的協同程序:

  1. 無堆棧
  2. Stackful

科特林實現了無堆疊的協同程序 - 它意味着 協程沒有自己的堆棧,所以它們不會在本地線程上映射。

這些都是啓動協程的功能:

launch{} 

async{} 

您可以瞭解更多從這裏:

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

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