python3.5中新增加了關於async和await語法和定義了何為coroutines物件,在平時使用時,會分不清哪些能夠await,所以記錄下對於可被await的物件的理解.
根據pep 492,可被await的物件主要分為4類:
對於以上的4種物件,我將就自己的理解進行下列解釋,如有不同的意見歡迎指點.
在pep 492中,同時也定義了async語法,主要用於在函式定義時,使該函式變為乙個native coroutine
function,也就是在用到async定義的函式時,一樣能被await
async def func():pass
async def main():
await func()
但是不僅僅使用types.coroutine裝飾器,函式必須使用yield from,並且後面返回乙個coroutine物件(即文中提到的除此之外的其他3種物件)
import typesimport asyncio
from tornado.queues import queue
q = queue()
@types.coroutine
def run():
print("this is run")
yield from q.put(1)
async def main():
await run()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
顧名思義,就是定義了__await__方法的物件也能被await,同時該方法必須返回iterator,否則就會報錯
關於asyncio.future物件可被await,也是新增了__await__ = __iter__這一行
對於該類物件不是很好確定,通常可看原始碼來確定是否具有__await__方法
還未嘗試過編譯cpython,所以對於這點並不是特別清楚,但是文件中也說了和__await__方法類似,同樣要返回乙個iterator
補充延伸:
最初想要搞清楚可被await的物件是因為在學習tornado過程中,要不斷的使用async和await方法,為了在使用時能較清楚的明白使用條件,才去研究了await的使用條件.
而在tornado中,除了以上4點之外,我目前還了解能被await的物件或方法具有乙個特徵: 那就是他們都返回awaitable或future,比如說tornado.queues中的queue,在使用過程中,會發現queue中有的方法可以被await,有的方法並不可以,在檢視了原始碼之後,發現可被await的方法都是返回乙個future物件,而該物件是來自於asyncio的future,其中實現了__await__,所以才能被await.
參考文獻:
對於Python中 property的理解和使用
2017年09月02日 22 03 22 重看狗書,看到對user表定義的時候有下面兩行 property def password self raise attributeerror password is not a readable attribute password.setter def ...
對於Python中 property的理解和使用
property 這個我們在很多 中都會用到,簡單講即為乙個唯讀屬性的呼叫 如果需要有修改許可權,需要再加乙個 屬性名.setter 例 usr bin env python coding utf 8 property 示例class student object propertydef score...
對於Python中yield的理解
yield常見用法 該關鍵字用於函式中會把函式包裝為generator。然後可以對該generator進行迭代 for x in fun param 在乙個函式中,程式執行到yield語句的時候,程式暫停,返回yield後面表示式的值,在下一次呼叫的時候,從yield語句暫停的地方繼續執行,如此迴圈...