协程的概念及Python中利用第三方库gevent使用协程
提到程序的并發操作,大多數人程序員首先想到的進程或者線程。我們先復習一下進程和線程的概念。
??進程:
進程(Process)是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序執行的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體
??線程:
線程,是程序執行的最小單元。一個標注的線程由線程ID,當前指令指針,寄存器集合和堆棧組成。另外,線程也是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可以與同屬一個進程的其他線程共享進程所擁有全部資源。一個線程創建和撤銷另一個線程,同一個進程中的多個線程并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有運行、阻塞、和就緒三種基本狀態。就緒狀態是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機。運行狀態是指線程戰友處理劑正在運行。阻塞狀態是指線程在等待一個事件,邏輯上不可執行。每個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
(以上內容來自百度百科,它從哪里來的就不知道了 ┑( ̄Д  ̄)┍ )
然后再說我們今天的主角協程
協程最大的優勢是他比線程更高的執行效率。協程不需要切換線程,沒有線程切換的開銷。和多線程相比,線程數量越多,協程的性能優勢就越明顯。第二大優勢就是不需要多線程鎖機制。因為只有一個線程,也不存在同時寫變量沖突(意思就是說協程在同一時刻絕對只有一個在執行,多線程中如果多個線程都需要對某變量進行修改,如果不加入多線程鎖,就可能出現多個線程同時對一個變量進行修改的問題)所以協程執行效率要高得多。協程只在一個線程中執行。如果想要利用多核cpu,最簡單的辦法是多進程+協程。
gevent:
Python通過yield提供了對協程的基本支持,但是不完全。而第三方的gevent 為Python提供了比較完善的協程支持。
當一個greenlet遇到IO操作時,比如訪問網絡,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行。由于IO操作非常耗時,經常使程序處于等待狀態,有了gevent為我們自動切換協程,就保證總有greenlet在運行,而不是等待IO。
由于切換是在IO操作時自動完成,所以gevent需要修改Python自帶的一些標準庫,這一過程在啟動時通過monkey patch完成
使用方法
from gevent import monkey; monkey.patch_socket() import geventdef f(p):print p spawns = [] spawns.append(gevent.spawn(f,55)) spawns.append(gevent.spawn(f,13)) spawns.append(gevent.spawn(f,66)) gevent.joinall(spawns)以上就是我在寫程序是最常用到的部分,程序會在所有spawns都執行完畢后,接著執行 gevent.joinall(spawns) 后面的代碼
另外網上說gevent只能在Linux/Unix下運行,在Windows下不能保證正常安裝和運行。親測,以上說法純屬胡說八道。
總結
以上是生活随笔為你收集整理的协程的概念及Python中利用第三方库gevent使用协程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql 查询一天中每半小时记录的数量
- 下一篇: python递归报错 RuntimeEr