簡體   English   中英

協程堆棧是否以Lua,Python,Ruby或任何其他語言增長?

[英]Does coroutine stacks grow in Lua, Python, Ruby or any other languages?

有一些語言支持確定性輕量級並發-協程。

  1. Lua-協程
  2. 無堆棧Python-Tasklet
  3. 紅寶石-纖維
  4. 應該更多...但是目前我沒有太多主意。

無論如何,據我所知,它需要許多分離的堆棧,所以我想知道這些語言如何處理堆棧的增長。 這是因為我閱讀了有關 4KB附帶的Ruby Fiber的信息 -顯然是很大的開銷-並且他們正在宣傳此功能,以防止堆棧溢出。 但是我不明白為什么他們只是說堆棧會自動增長。 VM-不限於C堆棧-無法處理堆棧增長,這是沒有道理的,但是我無法確認這一點,因為我不太了解內部機制。

他們如何處理這類微線程的堆棧增長? 有明確/隱含的限制嗎? 還是只是會被清晰,自動地處理?

對於紅寶石:

按照這個Google技術的說法 ,ruby vm使用一個稍微有點怪異的系統,涉及為每個線程復制C堆棧,然后每次在光纖之間切換時將該堆棧復制到主堆棧上。 這意味着Ruby仍然限制每個光纖的堆棧不能超過4KB,但是如果您在深層嵌套的光纖之間切換,則解釋器不會溢出。

對於python:

task-let僅在無堆棧版本中可用。 每個線程都有自己的基於堆的堆棧,因為無堆棧的python vm使用基於堆的堆棧。 這種混亂局面在本質上僅限於堆棧增長中堆的大小。 這意味着對於32位系統,仍然有1-4 GB的有效限制。

對於Lua:

Lua使用基於堆的堆棧,因此在堆棧增長中本質上僅限於堆的大小。 每個協程在內存中都有其自己的堆棧。 這意味着對於32位系統,仍然有1-4 GB的有效限制。

為了將更多信息添加到列表中,C#和VB.Net現在都支持異步/等待。 這是一個允許程序執行耗時的操作並使該功能的其余部分隨后繼續執行的系統。 這是通過創建一個對象來表示的,該對象用一個方法來表示,該方法被調用以前進到方法中的下一個步驟,當您嘗試獲取結果以及其他各種內部位置時,將調用該方法。 原始方法替換為創建對象的方法。 這意味着遞歸深度不會受到影響,因為該方法在堆棧的最下方不會比您期望的多出幾步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM