python3非同步asyncio學習筆記

2021-10-10 02:09:09 字數 3045 閱讀 6576

1、定義:微執行緒,人為創造協程,控制程式上下文切換執行流程,乙個執行緒中只能有乙個協程

2、python實現協程:

1、yield && yield from

2、asyncio模組

3、gevent模組

版本python3.5以上

1、事件迴圈–asyncio.get_event_loop()

檢測並執行某些**

import asyncio

# 生成乙個事件迴圈

loop = asyncio.get_event_loop(

)# 將任務放到『任務列表』

loop.run_untik_complate(任務)

asyncio.run()

內部先建立事件迴圈,在將任務放到任務列表執行

2、await

await+可等待的物件(協程物件、future、task物件)

import asyncio

async

defstart_run()

:print

('開始執行start run'

)await asyncio.sleep(2)

print

('結束執行 end'

)return

'返回值'

coroutine=start_run(

)# start_run()返回乙個協程物件

asyncio.run(coroutine)

await 等待物件執行結果結束之後再繼續執行

await遇到io操作切換到其他任務

3、task物件

在事件迴圈中併發新增多個任務

asyncio.create_task(協程物件)

asyncio.ensure_future(協程物件)

使用以上方法建立協程物件後,會將函式新增到事件迴圈中

import asyncio

async

defstart_run()

:print

('開始執行start run'

)await asyncio.sleep(2)

print

('結束執行 end'

)return

'返回值'

async

defmain()

: task_list =

[ asyncio.create_task(start_run())

, asyncio.create_task(start_run())

] done,pending =

await asyncio.wait(task_list,timeout=

none

)print

(done)

print

(pending)

if __name__ ==

'__main__'

: asyncio.run(main(

))

4、future物件

task繼承future物件,task物件結果處理基於future

import asyncio

async

defset_result

(fnt)

:# io操作

await asyncio.sleep(2)

#設定協程返回結果

fnt.set_result(

'result'

)async

defmain()

:# 獲取當前事件迴圈物件

loop = asyncio.get_running_loop(

)print

(loop)

# 建立future物件

fu = loop.create_future(

)print

(type

(fu)

)await loop.create_task(set_result(fu)

) res =

await fu

print

(res)

asyncio.run(main(

))

import asyncio,requests

async

defdownload_image

(url)

:print

(,url)

loop = asyncio.get_event_loop(

)# 可使用以下替換預設執行緒池為threadpoolexecutor

# exe = threadpoolexecutor(2)

# asyncio.get_event_loop().set_default_executor(exe)

# 使用loop中帶的執行緒池實現

future_loop = loop.run_in_executor(

none

,requests.get,url,

) response =

await future_loop

print()

# 儲存

filename = url.split(

'_')[-

1]with

open

(filename,mode=

'wb'

)as file_obj:

file_obj.write(response.content)

if __name__ ==

'__main__'

: url_list =

['',''

,''] tasks =

[download_image(url)

for url in url_list]

loop = asyncio.get_event_loop(

) loop.run_until_complete(asyncio.wait(tasks)

)

python3 非同步 async with 用法

非同步上下文管理器指的是在enter和exit方法處能夠暫停執行的上下文管理器。為了實現這樣的功能,需要加入兩個新的方法 aenter 和 aexit 這兩個方法都要返回乙個 awaitable型別的值。非同步上下文管理器的一種使用方法是 class asynccontextmanager asyn...

python3 非同步模組asyncio

yield方法引入,這裡存在的問題是,如果你想建立從0到1,000,000這樣乙個很大的序列,你不得不建立能容納1,000,000個整數的列表。但是當加入了生成器之後,你可以不用建立完整的序列,你只需要能夠每次儲存乙個整數的記憶體即可。import asyncio asyncio.coroutine...

python3 非同步訊息佇列 RQ 處理

rq是redis queue的縮寫,乙個基於redis的簡單 輕量的非同步訊息佇列工具。如果在 中使用者發起乙個用時很久的請求,如果用同步的方式,伺服器就會返回超時。這時候就需要用非同步請求,使用者發起請求後,服務端把作業扔給另乙個程序去執行,然後立刻返回給使用者,使用者再通過輪詢或者其他方式來獲取...