Python协程之Gevent
admin
2023-07-12 16:04:45
0

协程,又称微线程,即为轻量级的线程。
python中实现协程是基于Gevent模块,Gevent模块内部封装了greenlet模块;greenlet模块实现了在单线程中切换状态,Gevent模块在此之上还实现了遇到I/O操作自动切换,使程序运行更快;但是Gevent只在遇到自己认识的I/O操作时切换,所以需要使用Gevent包的一个模块:猴子补丁,使用了这个补丁,Gevent会直接修改在它之后导入的模块中的I/O操作,使其可以让Gevent识别,从而开启协程。
Greenlet与Gevent模块都是python的第三方模块,需安装使用。

1、Greenlet

主要方法:

g = greenlet(run=None, parent=None):实例化一个greenlet对象
g.parent:每一个协程都有一个父协程,当前协程结束后会回到父协程中执行,该属性默认是创建该协程的协程
g.run: 该属性是协程实际运行的代码. run方法结束了,那么该协程也就结束了
g.switch(*args, **kwargs): 切换到g协程
g.throw(): 切换到g协程,接着抛出一个异常

示例:

from greenlet import greenlet

def work():
    print("1")
    g2.switch() # 切换到g2协程
    print("3")
    g2.switch()

def work2():
    print("2")
    g1.switch()
    print("4")

g1 = greenlet(work)  # 创建一个greenlet实例
g2 = greenlet(work2)
g1.switch() # 切换到g1协程

结果:

1
2
3
4

2、Gevent

示例1:

from gevent import monkey
monkey.patch_all()      # monkey补丁会将在它之后导入的模块的IO操作打包,使gevent认识他们
import gevent

def work1():
    print("1")
    gevent.sleep(1)
    print("3")

def work2():
    print("2")
    gevent.sleep(1)
    print("4")

g1 = gevent.spawn(work1)
g2 = gevent.spawn(work2)

# g1.join()
# g2.join()

gevent.joinall([g1,g2])

示例2:爬取网页

from gevent import monkey;monkey.patch_all()
import gevent
import requests

def get_url(url):
    res = requests.get(url)
    print(url,res.status_code,len(res.text))

url_l = [
    'http://www.baidu.com',
    'http://www.google.com',
    'https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5',
    'https://www.youtube.com/?app=desktop',
    'https://www.facebook.com/',
    'http://www.python.org',
    'http://www.cnblogs.com'
]
g_l = []
for i in url_l:
    g_l.append(gevent.spawn(get_url,i))
gevent.joinall(g_l)

相关内容

热门资讯

问题居然在实体卡槽上!美版iP... 6月2日消息,日前,又有博主提前把还没发布的iPhone 18 Pro电池参数给曝光了出来,根据爆料...
2026年618手机购机攻略:... 每年618都是手机换新的最佳窗口期,2026年大促叠加数码国补、平台满减、品牌降价三重福利,新机老机...
8.99万打穿底价!史无前例的... 科技的浪漫,不是将人类送入遥不可及的星辰,而是把曾经高不可攀的科幻,变成柴米油盐里的“论斤卖”。 如...
苹果首款折叠屏iPhone U... PChome 6月2日消息,据知名数码博主@i冰宇宙最新曝光的机模谍照,苹果首款折叠屏手机(内部命名...
特朗普:美伊暂停谈判?假新闻! 当地时间6月2日,美国总统特朗普否认伊朗已停止与调解方沟通,称美国与伊朗之间的对话一直在持续进行。特...
白宫记协晚宴改期至7月,特朗普... 当地时间6月2日,美国总统特朗普表示,此前因突发暴力事件而中断的白宫记协晚宴已确定改期至7月24日举...
特朗普,开掉“不听话的情报头子... 苦撑15个月后,美国国家情报总监加巴德即将离开白宫。她对辞职的解释是:丈夫近期确诊罕见骨癌,自己希望...
面粉染头模仿黄仁勋,农村青年走... “先赔偿5000元肖像侵权使用费,再删除所有视频,要么就起诉你。”这是黄仁勋的模仿者杨洋最近频繁收到...
驻马店非遗“大集”开张 把网络... 顶端新闻记者 王丹/文 李思翰 胡楚昊/图红纸剪出“抵制网络谣言”,糖画写下“不信谣不传谣”……5月...
A股三大指数集体收涨 贵金属涨...   A股三大指数集体收涨 贵金属涨幅居前  【A股三大指数集体收涨 贵金属涨幅居前】6月2日,A股三...