最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python異步完全指南實(shí)例小結(jié)

 更新時(shí)間:2026年01月14日 08:51:08   作者:MyKai + 關(guān)注  
本文主要介紹了Python中并行處理多個(gè)任務(wù)的幾種方式,包括多進(jìn)程、多線程和異步編程,多進(jìn)程適用于CPU密集型任務(wù),多線程適用于I/O密集型任務(wù),異步編程通過(guò)單線程和協(xié)程實(shí)現(xiàn)高效并發(fā),感興趣的朋友跟隨小編一起看看吧

Python中并行處理多個(gè)任務(wù)主要是靠:

  • thread 線程
  • process 進(jìn)程
  • asyncio 非同步

process

將一個(gè)py 腳本放入到內(nèi)存中,程序就變成了 一個(gè)process

process 是程序運(yùn)行的實(shí)例,process 有自己的內(nèi)存,通信;不同的process之間彼此獨(dú)立

process 通常分為二種

  • I/O密集型,cpu使用率較低,大量時(shí)間在等待網(wǎng)絡(luò),用戶輸入輸出
  • CPU 密集型,cpu使用率較高,在大量計(jì)算,數(shù)據(jù)分析,視頻編碼等

Thread 線程

線程是Process的最小單位,每個(gè)Process 至少有一個(gè)線程(主線程);線程在同一個(gè)process內(nèi)共享資源,一個(gè)線程操作不當(dāng),會(huì)導(dǎo)致整個(gè)process 崩潰。

CPU 執(zhí)行process / thread的機(jī)制

CPU 一次只能執(zhí)行一個(gè)任務(wù),為了處理多個(gè)任務(wù),搶占式切換任務(wù)。

搶占式切換:process保留當(dāng)前狀態(tài),開(kāi)辟新的內(nèi)存空間,增加消耗,在同一個(gè)process里,thread 共享空間,所以開(kāi)銷(xiāo)更小。

對(duì)于多核CPU ,每個(gè)核心都能處理不同的進(jìn)程。節(jié)省了大量的切換開(kāi)銷(xiāo)。

PYTHON GIL鎖機(jī)制

在同一個(gè)process內(nèi),GIL是一種鎖,允許任何時(shí)候只有一個(gè)線程控制 Python 解釋器。在I/O 等待場(chǎng)景,會(huì)釋放GIT鎖。

GIL 的存在是為了解決競(jìng)態(tài)問(wèn)題,防止多個(gè)線程彼此大家。

asyncio 異步

asyncio 使用單一線程來(lái)處理多個(gè)任務(wù),避免了大量上下文切換帶來(lái)的開(kāi)銷(xiāo)

  • Coroutines 把普通函數(shù)定義為協(xié)程函數(shù) 代表該函數(shù)可以暫停/恢復(fù)
  • Event loop 事件循環(huán),負(fù)責(zé)管理執(zhí)行Coroutines
  • Tasks 協(xié)程具體的對(duì)象 通過(guò)asyncio.create_task()調(diào)度
  • await 暫停協(xié)程的執(zhí)行

協(xié)程創(chuàng)建之后,不會(huì)自動(dòng)調(diào)用。asyncio.run()來(lái)運(yùn)行

適合 需要大量等待的小任務(wù)場(chǎng)景

asyncio.create_task()

讓函數(shù)立即進(jìn)入隊(duì)列(不是立即執(zhí)行,等待其他函數(shù)交出控制權(quán))create_task() 解除等待關(guān)系,把協(xié)程交給事件循環(huán)管理;只要存在 await 的讓出點(diǎn),多個(gè)任務(wù)就可以交叉推進(jìn)

await a()
await b()
# 交叉
ta = create_task(a())
tb = create_task(b())
await ta
await tb

asyncio.to_thread

asyncio.to_thread 讓同步阻塞代碼在另一個(gè)線程運(yùn)行,從而保證事件循環(huán)線程不被阻塞。

async def main():
    print("start")
    asyncio.create_task(
        asyncio.to_thread(fetch_data)
    )
    print("end")
寫(xiě)法函數(shù)何時(shí)執(zhí)行當(dāng)前協(xié)程是否繼續(xù)
await to_thread()立即(在線程)否(等結(jié)果)
create_task(to_thread())立即(在線程)

檢測(cè)判斷

你在 async 函數(shù)里,要調(diào)用一個(gè)函數(shù) F

├─ F 是 async 協(xié)程函數(shù)?
│ │
│ ├─ 是
│ │ │
│ │ ├─ 需要等 F 的結(jié)果?
│ │ │ ├─ 是 → await F()
│ │ │ └─ 否 → create_task(F())
│ │ │
│ │ └─(結(jié)束)
│ │
│ └─ 否(F 是同步阻塞函數(shù))
│ │
│ ├─ 需要等 F 的結(jié)果?
│ │ ├─ 是 → await asyncio.to_thread(F)
│ │ └─ 否 → create_task(asyncio.to_thread(F))
│ │
│ └─(結(jié)束)

到此這篇關(guān)于Python異步完全指南的文章就介紹到這了,更多相關(guān)Python異步完全指南內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

依兰县| 綦江县| 成安县| 永寿县| 河西区| 盐池县| 嘉荫县| 陆川县| 探索| 凭祥市| 徐州市| 临潭县| 浑源县| 西宁市| 呼图壁县| 四平市| 洱源县| 徐水县| 绥江县| 靖宇县| 綦江县| 桓台县| 张家界市| 昭苏县| 佛教| 五原县| 治多县| 扶沟县| 炉霍县| 佛山市| 长宁县| 大冶市| 辽阳市| 宁海县| 古浪县| 古浪县| 平江县| 衡水市| 尉犁县| 田东县| 鸡东县|