2009-12-24 49 views
8

我想用一種支持併發的語言來啓動一個新的網絡服務器項目,這種語言通過光纖又名協程(又稱用戶模式線程)來支持併發。確定我的選項到底是什麼非常困難,因爲術語「協同程序」似乎被用來很鬆散地表示各種各樣的東西,並且「纖維」幾乎完全用於參考Win32 API。支持光纖/協程的腳本語言?

對於這個問題的目的,協程/纖維:

  • 通過從其中在調用棧從嵌套函數中得到的結果到調用函數(即任意深度暫停執行的支持方法的協程/纖維調用)
  • 支持在當前執行點(即收益率的協程是沒打電話給你的協同程序)

什麼是我的語言選項將控制轉移到另一個任意協程S'我知道Ruby 1.9和Perl(Coro)都有支持,還有什麼?任何具有成熟gc和動態方法調用的東西都已足夠。

回答

1

Stackless Python是另一種選擇,可以滿足您的要求。如果Python,Ruby和Perl都不適合你的目的(儘管所有的都滿足你所陳述的要求),你可能會有其他未明確的要求或偏好 - 請注意將它們拼出來嗎? - )

+0

我想在選擇語言之前評估我的所有選項。我不會立即選擇ruby,因爲GC可能會很慢,而且很大,所以我不會立即選擇Perl,因爲它的語法比較難看。這就是說,Perl是目前的領跑者。 – 2009-12-24 03:11:14

+0

另外,你知道PEP 342是否能讓普通的Python變得合適嗎? send()看起來像是朝着正確的方向邁出的一步,但我無法確定是否可以從調用堆棧的深處獲得收益。 – 2009-12-24 03:21:23

+1

@Logan,一個Python生成器只能向其調用者屈服,而不是任何其他任意位置 - 無論如何構建協程系統,一個使用「蹦牀」安排,如PEP 342中的示例3所示。 – 2009-12-24 03:32:18

1

計劃有call-with-current-continuation這是一個建築物可以建立各種流量控制的模塊。它絕對可以支持你提到的兩個用途。

有很多強大的,廣泛可用的Scheme實現,如PLT SchemeChicken Scheme

+0

Ruby具有' callcc'。雖然速度不是很快,因爲它複製了整個C堆棧。 – pts 2010-11-30 18:30:11

6

greenlet擴展符合您在Python中的要求(普通的一個,而不是Stackless)。

Greenlet API有點低級,所以我推薦使用gevent,它可以爲您提供適用於應用程序的API。 (免責聲明:我寫了gevent)

+0

+1,greenlet是質量,但gevent不支持python 3 – 2011-09-19 07:17:50