Python非同步程式設計

2021-10-14 04:16:32 字數 1894 閱讀 6384

關於async和await:

python 3.5提供asyncawait,來實現非同步呼叫

有的庫提供非同步的函式修飾器,可以用庫介面,當然最好是用原生的asyncawait

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 絕對值得檢視。非同步是怎麼一回事?在傳統的順序程式設計中,所有傳送給直譯...