[英]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.