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