簡體   English   中英

Python解釋器如何實現協程

[英]How does Python interpreter implement coroutine

目前,我正在嘗試了解Python如何實現yield和generators。 在文件上說

所謂暫停,是指保留所有局部狀態,包括局部變量的當前綁定,指令指針,內部評估堆棧以及任何異常處理的狀態。 當通過調用生成器的方法之一恢復執行時,該函數可以像yield表達式只是另一個外部調用一樣繼續進行。

這對我來說似乎非常違反直覺,因為我知道的所有函數調用方案都是基於堆棧的,例如C調用約定。 我真的很好奇Python如何在幕后存儲函數的所有狀態,以及執行的流程如何在yield之后回到原來的位置。

最后一個問題是,是否有任何算法可以從任意生成器函數派生生成器迭代器的實現。 例如,假設我們有一個生成器函數:

def generator_f():
    for i in range(10):
        yield i
    for i in range(10):
        yield i

我們能否系統地實現一個在功能上等效於generator_f()返回的generator_f()器迭代器的迭代器? 從功能上講,我指的是行為和(內存)效率。

您可以在cpython/Lib/asyncio/coroutines.py查看Cpython如何實現協cpython/Lib/asyncio/coroutines.py 要查看生成器的實現方式,請參見cpython/Objects/genobject.c 具體來說,在函數gen_getyieldfrom()_PyGen_yf()可以找到yield from背后的邏輯。

關於有關等效迭代器的問題:

iter([*range(10), *range(10)])

暫無
暫無

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

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