協程是什麼?為什麼越來越多的程式設計師開始使用協程?

2020-12-25 技頑

隨著異步的話題和框架越來越多,協程的使用基本都是面試的一個必備知識點了。不單單在自己的程序中使用協程,越來越多的框架,模塊,比如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網站保持友好的溝通……時不時的會分享一些提高效率的編程小技巧,在實際應用中遇到的問題以及解決方案,或者源碼的閱讀等等,歡迎大家一起來討論!如果覺得寫得還不錯,歡迎關注點讚,謝謝。

相關焦點

  • 知乎轉載:也來談談協程
    這篇文章的問題就在於此:作者攔腰從「用協程優化線程」這個奇怪的中間應用場景開始,沒頭沒尾開始「揭露真相」;然後又有很多人從末梢開始,引入「協程本質上是狀態機」、「協程用於解決callback hell」、「協程在IO密集型業務中才能發揮威力」等莫名其妙卻又言之鑿鑿的結論。於是,事情就越發複雜化,越發不可解決了。其實,這類問題有一個很簡單的解決辦法,那就是——追根溯源。
  • 一文講透 「進程、線程、協程」
    以下文章來源於程式設計師小灰 ,作者頭文件程式設計師小灰一群喜愛編程技術和算法的小倉鼠。本文從作業系統原理出髮結合代碼實踐講解了以下內容:什麼是進程,線程和協程?它們之間的關係是什麼?為什麼說Python中的多線程是偽多線程?不同的應用場景該如何選擇技術方案?...
  • 最牛的異步程序寫法——協程
    要講清楚協程的原理非常難,我也只是了解一點皮毛,不過我還是很想把這些皮毛跟大家分享一下,首先跟大家說一下多進程、多線程和協程的原理。進程是系統分配資源的最小單位,多進程耗費系統資源,一般不會使用,而一個進程又可以包含多個線程,多線程要比多進程節省資源,在Python中由於全局解釋器鎖的存在,一個進程中同一時間最多只能執行一個線程,所以Python原生是不支持異步並發的。
  • Swoole v4.6.0 版本發布,支持原生 curl 協程客戶端
    向下不兼容改動從 v4.6.0 版本開始將不再支持 PHP7.1PHP 官方對於 PHP7.1 的支持也早已在 2019 年底結束。將 Event::rshutdown() 標記為已棄用,請改用 Coroutine\run在之前的版本中,如果在index.php中直接使用go創建協程go(function () {    var_dump(Co\System::gethostbyname('www.baidu.com
  • 每日一課丨Python爬蟲:單線程、多線程和協程的爬蟲性能對比
    今天我要給大家分享的是如何爬取豆瓣上深圳近期即將上映的電影影訊,並分別用普通的單線程、多線程和協程來爬取
  • 酵素是什麼?為什麼越來越多的人使用酵素麵膜?
    酵素是什麼?為什麼越來越多的人使用酵素麵膜?可敷完酵素麵膜,毛孔裡那些分泌物就像被「吸光」了一樣,粉刺針壓根擠不出什麼東西來,一些小閉口也變平了。
  • 美國州長竟然搶起高齡程式設計師了,什麼情況?
    新澤西州的失業保險系統是用 COBOL 語言開發,哪裡受到了這麼多人同時在線申領保險,沒幾天就被衝擊垮了。但懂 COBOL 語言的程式設計師卻不好找,沒有辦法積累了太多的失業金無法發放,於是州長開始在電視臺上公開招聘。
  • 光鮮亮麗的程式設計師,背後的悲哀是什麼?
    身體每況愈下身邊的朋友明明才30出頭,已經開始出現三高症狀,有些人甚至因為久坐和生活作息紊亂出現糖尿病症狀。像網上傳的髮際線後移、地中海、失眠等更是人人都會得一點的職業病。每到休息日,與其考慮去哪裡玩,程式設計師們更願意在床上躺一天,緩解一下疲勞的大腦。要知道,腦力勞動永遠比 體力勞動費力,也更需要休息。
  • AI 技術越來越平民化,程式設計師不想被淘汰該怎麼辦?
    我們邏輯是AI不能做什麼,現在越來越多人明白了AI不能做什麼,一是沒有數據做不了,二是就算有了數據,沒有洞察力也做不了的事。我們捫心自問,只要人做的行業基本都能產生數據,也能夠有模式。但是為什麼很多公司很多企業很難落地?因為第一步還沒有做,就開始有第二步、第三步了,就說要做算法、做人工智慧。
  • 袋鼠醫生為您揭秘為什麼越來越多家庭開始使用霧化器?
    現在越來越多的家庭都備了一臺霧化器,不僅使用方便,而且用處還非常大。那麼為什麼霧化器如此受歡迎呢?下面袋鼠醫生就為大家揭秘霧化器受歡迎的原因。霧化器主要用於治療各種呼吸系統疾病,如感冒、發熱、咳嗽、哮喘等疾病。