1、yield實現
import time
def task_1():
while true:
print("---1---")
time.sleep(0.1)
yield
def task_2():
while true:
print("---2---")
time.sleep(0.1)
yield
def main():
t1 = task_1() # 建立迭代器
t2 = task_2()
while true:
next(t1) # 當程式執行到yield之後返回來執行下一句
next(t2)
if __name__=="__main__":
main()
2、greelet實現
import time
import greenlet
def task_1():
while true:
print("---1---")
gr2.switch() # 切換到gr2
time.sleep(0.1)
def task_2():
while true:
print("---2---")
gr1.switch() # 切換到gr1
time.sleep(0.1)
gr1 = greenlet.greenlet(task_1)
gr2 = greenlet.greenlet(task_2)
gr1.switch()
3、gevent實現
import gevent
import time
def test1(n):
for i in range(n):
print(gevent.getcurrent(),i)
# time.sleep(0.5)
gevent.sleep(0.2)
def test2(n):
for i in range(n):
print(gevent.getcurrent(),i)
# time.sleep(0.5)
gevent.sleep(0.2) # 好使 堵塞,開啟別的任務,只要堵塞切換到別的任務去
def test3(n):
for i in range(n):
print(gevent.getcurrent(),i)
# time.sleep(0.5)
gevent.sleep(0.2) # 協程最核心的就是使用堵塞時間切換任務,實際上還是單執行緒
# 協程呼叫資源最少,相當於呼叫函式
print('---1---')
g1 = gevent.spawn(test1,5) # 建立物件,還沒有開啟
print('---2---') # 沒有堵塞,不開啟
g2 = gevent.spawn(test2,5) # 建立物件,還沒有開啟
print('---3---') # 沒有堵塞,不開啟
g3 = gevent.spawn(test3,5) # 建立物件,還沒有開啟
print('---4---') # 沒有堵塞,不開啟
g1.join()# 有堵塞,開啟g1
g2.join()
g3.join()
4、使用monkey轉換為gevent等待
import gevent
import time
from gevent import monkey
def test1(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.5)
def test2(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.5)
def test3(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.5)
monkey.patch_all() # 檢查**中所有延時操作變成gevent.sleep()
print('---1---')
g1 = gevent.spawn(test1,5) # 建立物件,還沒有開啟
print('---2---') # 沒有堵塞,不開啟
g2 = gevent.spawn(test2,5) # 建立物件,還沒有開啟
print('---3---') # 沒有堵塞,不開啟
g3 = gevent.spawn(test3,5) # 建立物件,還沒有開啟
print('---4---') # 沒有堵塞,不開啟
g1.join()# 有堵塞,開啟g1
g2.join()
g3.join()
5、使用gevent.joinall()
import gevent
import time
from gevent import monkey
def test1(name):
for i in range(10):
print(name,i)
time.sleep(0.5)
def test2(name):
for i in range(10):
print(name,i)
time.sleep(0.5)
def test3(name):
for i in range(10):
print(name,i)
time.sleep(0.5)
monkey.patch_all() # 檢查**中所有延時操作變成gevent.sleep()
gevent.joinall([
gevent.spawn(test1, "test1"),
gevent.spawn(test2, "test2"),
gevent.spawn(test3, "test3")
])
6、些程實現爬取
import gevent
import urllib.request
def **********(name,url):
req = urllib.request.urlopen(url)
img_content = req.read() # read的情況下會發生等待,所以會利用這個空隙做另乙個任務
gevent實現簡單的協程
協程,又稱微執行緒。是指程式在執行執行緒a的時候如果碰到耗時操作,會自動切換到函式b執行,b碰到耗時操作自動切換回a。這一系列動作看起來像多執行緒,但是卻只有乙個執行緒執行。優勢 占用資源更少 多工占用資源排名 程序 執行緒 協程 執行效率極高,因為切換函式執行不是執行緒切換,而是程式本身控制,沒有...
使用協程(gevent 實現請求
協程,又稱微執行緒。英文名coroutine。協程最大的優勢就是協程極高的執行效率。因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。第二大優勢就是不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時寫變數衝突,在...
Python使用gevent實現協程
coding utf8 import requests import gevent from gevent import monkey monkey.patch all 用於將標準庫中大部分阻塞式呼叫修改為協作式執行 def fetch url print get format url respon...