隨著異步的話題和框架越來越多,協程的使用基本都是面試的一個必備知識點了。不單單在自己的程序中使用協程,越來越多的框架,模塊,比如tornado、fastapi、aiohttp也都是基於異步實現,所以分享下我對協程的理解。本文為第一篇,先說些基礎的,應該還會有一篇。本文基於python
01協程相關的概念
想要了解協程,必須先簡單說下進程和線程。進程和線程都是作業系統之下的概念,而協程則是程式設計師自己設計的代碼運行過程。
進程
在作業系統中,每一個獨立運行的程序,都佔有作業系統分配的資源,這些程序互不幹涉,都只負責運行自己的指令,這就是進程
線程
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源
協程
協程(Coroutine),也可以被稱為微線程,是一種用戶態內的上下文切換技術。簡而言之,其實就是通過一個線程實現代碼塊相互切換執行
同步
執行一個操作之後,等待結果,然後才繼續執行後續的操作
異步
執行一個操作後,可以去執行其他的操作,然後等待通知再回來執行剛才沒執行完的操作
02協程的意義
總結來說就一句話:對於並發執行的程序來講,減少上下文切換的開銷,提升程序的性能!
協程是為了提高並發的效率,只是單純的設計協程,但程序跟並發毫無關係,那麼這樣的協程毫無意義!
協程一般是基於上一個協程函數運行的結果,用結果繼續做某個操作。
03在python中使用協程的歷史
這裡簡單介紹下協程在python歷史中的四種實現方式,包含代碼
第三方庫greenlet
yield語法
裝飾器asyncio
async/await關鍵字
以前基本都用greenlet(現在的很多框架還是保留著greenlet),現在基本都是async/await關鍵字了,官方推薦!
04協程實現的套路
協程有兩個重要的概念:協程函數和協程對象。
協程函數:async def 聲明的函數
協程對象:協程函數的調用(協程函數加括號的形式)
最簡單的協程(以前的方式:主要是__main__以下的部分)
如果想要運行協程函數內部代碼,必須要講協程對象交給事件循環來處理
最簡單的協程(現在的方式:__main__以下的部分)
要真正運行一個協程,asyncio 提供了三種主要機制
上面的asyncio.run算是一種,不說了協程之間的等待調用,以下代碼段會在等待1秒後列印 "hello",然後再次等待2秒後列印 "world"
並發執行函數,通過asyncio.create_task()語法創建多個並發任務當執行某協程,遇到IO操作時,會自動化切換執行其他任務
<本章>完!
我是一名奮戰在編程界的pythoner,工作中既要和數據打交道,也要和erp系統,web網站保持友好的溝通……時不時的會分享一些提高效率的編程小技巧,在實際應用中遇到的問題以及解決方案,或者源碼的閱讀等等,歡迎大家一起來討論!如果覺得寫得還不錯,歡迎關注點讚,謝謝。