我們通常所說的協程coroutine其實是corporateroutine的縮寫,直接翻譯為協同的例程,一般我們都簡稱為協程。
在linux系統中,執行緒就是輕量級的程序,而我們通常也把協程稱為輕量級的執行緒即微執行緒。
程序是核心排程,而協程是在使用者態排程,也就是說程序的上下文是在核心態儲存恢復的,而協程是在使用者態儲存恢復的,很顯然使用者態的代價更低
程序會被強佔,而協程不會,也就是說協程如果不主動讓出cpu,那麼其他的協程,就沒有執行的機會。
對記憶體的占用不同,實際上協程可以只需要4k的棧就足夠了,而程序占用的記憶體要大的多
從作業系統的角度講,多協程的程式是單程序,單協程
執行緒之間需要上下文切換成本相對協程來說是比較高的,尤其在開啟執行緒較多時,但協程的切換成本非常低。
同樣的執行緒的切換更多的是靠作業系統來控制,而協程的執行由我們自己控制
猴子補丁的作用:
協程用time.sleep(1)不能切換任務,用gevent.sleep(1)可以, 所以,猴子補丁
協程任務之間的切換由程式**(gevent)完成,只有遇到協程模組能識別到的io操作的時候,程式才會進行協程切換,實現併發的效果
在這個patch_all後面的所有模組中,發生的阻塞都會有gevent的效果
所以,注意猴子補丁的位置。會導致不能切換執行緒。
不要在b.py的全域性設定monkey.patch_all(), 而是到具體需要使用gevent的函式中再設定。這樣a.py引用b.py時就不會引用到monkey.patch_all()的設定了。
程序 執行緒與協程
程序的出現是為了更好的利用cpu資源使到併發成為可能。假設有兩個任務a和b,當a遇到io操作,cpu默默的等待任務a讀取完操作再去執行任務b,這樣無疑是對cpu資源的極大的浪費。聰明的老大們就在想若在任務a讀取資料時,讓任務b執行,當任務a讀取完資料後,再切換到任務a執行。注意關鍵字切換,自然是切換...
程序 執行緒與協程
程序 執行緒和協程是三個在多工處理中常聽到的概念,三者各有區別又相互聯絡。程序,直觀點說,儲存在硬碟上的程式執行以後,會在記憶體空間裡形成乙個獨立的記憶體體,這個記憶體體有自己獨立的位址空間,有自己的堆,上級掛靠單位是作業系統。作業系統會以程序為單位,分配系統資源 cpu時間片 記憶體等資源 程序是...
程序 執行緒 協程
多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...