gevent實現協程

2021-09-25 18:51:19 字數 3653 閱讀 4664

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...