所謂協程又稱為微執行緒,我們在程序在建立時, 需要耗費時間和cpu資源;在建立多執行緒時,也需要消耗時間和資源。利用多協程的執行過程中,始終只要乙個執行緒, 不存在建立執行緒和銷毀執行緒需要的時間; 也沒有執行緒切換的開銷, 任務需要開啟執行緒數越多, 協程的優勢越明顯;更不需要多執行緒的鎖機制(gil)。
import time
def producer(c):
c.__next__()
n = 0
while n <5:
n +=1
print("[生產者]生產資料: %s" %(n))
res = c.send(n)
print("[消費者的返回值為:%s" %(res))
def consumer():
r = "a"
while true:
# yield r ====> r如何獲取? print(c.__next__())
# n = yield r ==> c.send("任務1") ===> n = "任務1"
n = yield r
if not n:
return
print("[消費者]執行%s....." %(n))
time.sleep(1)
r = "200 ok"
# 函式中有yield, 返回值為生成器;
c = consumer()
print(c.__next__())
print(c.send("任務1"))
# 由於切換是在io操作時自動完成, 所以gevent需要修改python自帶的一些標準庫;# gevent提供了patch_*來對於標準庫作修改;
import gevent
import time
from gevent import monkey
monkey.patch_all()
def job(n):
for i in range(n):
print(gevent.getcurrent(), n)
time.sleep(0.5)
def main1():
# 建立三個協程, 並讓該協程執行job任務
# 假設多協程執行的任務, 沒有io操作或者等待, 那麼協程間是依次執行, 而不是交替執行;
# 假設多協程執行的任務, io操作或者等待, 那麼協程間是交替執行;
g1 = gevent.spawn(job, 1)
g2 = gevent.spawn(job, 2)
g3 = gevent.spawn(job, 3)
gevent.joinall([g1, g2, g3])
print("執行任務結束")
測試**:
import time
from urllib.request import urlopen
from concurrent.futures import threadpoolexecutor
import gevent
from gevent import monkey
from 多程序與多執行緒._timeit import mytime
monkey.patch_all()
def load_url(url):
with urlopen(url) as conn:
data = conn.read()
print("%s網頁位元組數為%s" % (url, len(data)))
urls = ['', ''] * 1000
@mytime
def gevent_main():
gevents = [gevent.spawn(load_url, url) for url in urls]
gevent.joinall(gevents)
@mytime
def thread_main():
with threadpoolexecutor(max_workers=100) as f:
f.map(load_url, urls)
if __name__ == "__main__":
gevent_main()
thread_main()
python協程使用 協程的案例
概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...
對協程的理解
對於作業系統來說,協程其實是一種特殊的執行緒,對於cpu來說,協程是非搶占式 程序和執行緒是搶占式的 實現機理如下 有兩個function a,b,a呼叫b,b要執行一段時間,很晚才返回,a不會因為等b而一直占用cpu,即a是非阻塞的。b返回後,a又能繼續執行。神奇的是,a和b又是走在一條獨木橋 橋...
對協程的理解
實現併發,可以使用多程序,多執行緒。程序和執行緒有個共同點,他們都是通過作業系統來排程的。而協程,則把排程的權力交給了程式設計師。協程可以看作使用者態下協作的執行緒。使用者態 是說協程的排程權屬於程式設計師。協作 是說協程的排程是協作式的,不是搶占的。在協程中,某部分可以通過呼叫某個方法,將控制權交...