關於async和await:
python 3.5提供async
和await
,來實現非同步呼叫
有的庫提供非同步的函式修飾器,可以用庫介面,當然最好是用原生的async
和await
import asyncio
async
defhello
(num)
:print
('hello {}'
.format
(num)
)await asyncio.sleep(1)
return
'world {}'
.format
(num)
if __name__ ==
'__main__'
: asyncio.run(hello(1)
)
單個任務async其實沒有什麼意義,多個任務同時跑動,非同步才會有效
但是多個任務非同步不能用for迴圈簡單的把多個任務串在一起,以下是錯誤寫法,該寫法其實會導致,10個非同步任務還是順序執行的,並且會耗時10s
import asyncio
async
defrun_task()
:for i in
range(10
):await hello(i)
async
defhello
(num)
:print
('hello {}'
.format
(num)
)await asyncio.sleep(1)
return
'world {}'
.format
(num)
if __name__ ==
'__main__'
: asyncio.run(run_task())
# 以下這種方式也是錯的
# for i in range(10):
# asyncio.run(hello(i))
使用async_wait或者async_gather批量執行任務,以下程式耗時約為1s,10個任務1s執行完
import asyncio
async
defrun_task()
:for i in
range(10
):print
(await hello(i)
)async
defhello
(num)
:print
('hello {}'
.format
(num)
)await asyncio.sleep(1)
return
'world {}'
.format
(num)
if __name__ ==
'__main__'
: loop = asyncio.get_event_loop(
) tasks =
for i in
range(10
):task = asyncio.ensure_future(hello(i)
)# 如果不關心結果,可以用wait
result = loop.run_until_complete(asyncio.wait(tasks)
)# 關心結果,則使用gather
# result = loop.run_until_complete(asyncio.gather(*tasks))
# print(result)
loop.close(
)
python 非同步程式設計
但協程的特點在於是乙個執行緒執行,那和多執行緒比,協程有何優勢?最大的優勢就是協程極高的執行效率。因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。第二大優勢就是不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時...
風火程式設計 python發布celery非同步任務
1.建立celery應用from celery import celery name broker celery backend celery 定義celery任務 def celery job args,kwargs 定義非同步任務 return result 任務邏輯 3.發布celery任務c...
Python中的非同步程式設計 Asyncio
如果你已經決定要理解 python 的非同步部分,歡迎來到我們的 asyncio how to 注 哪怕連異動正規化的存在都不知道的情況下,你也可以成功地使用 python。但是,如果你對底層執行模式感興趣的話,asyncio 絕對值得檢視。非同步是怎麼一回事?在傳統的順序程式設計中,所有傳送給直譯...