博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python网络编程——协程
阅读量:6372 次
发布时间:2019-06-23

本文共 1805 字,大约阅读时间需要 6 分钟。


个人独立博客:

微信公众号:TechBoard


协程的概念

协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字表示就是协程

协程也是实现多任务的一种方式

协程yield的代码实现

简单实现协程

import time# 定义协程def work1():    while True:        print("work1...")        time.sleep(1)        yielddef work2():    while True:        print("work2...")        time.sleep(1)        yieldif __name__ == '__main__':    g1 = work1()    g2 = work2()    while True:        next(g1)        next(g2)
实现协程的第二种方式:greenlet

greenlet介绍:为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变得更加简单

首先使用pip安装greenlet模块:

pip3 install greenlet

greenlet的使用:

# greentlet的使用import greenletimport timedef work1():    for i in range(10):        print("work1")        time.sleep(1)        g2.switch()def work2():    for i in range(10):        print("work2")        time.sleep(1)        g1.switch()# 创建协程并指定任务g1 = greenlet.greenlet(work1)g2 = greenlet.greenlet(work2)if __name__ == '__main__':    g1.switch()

实现协程的第三种方式:gevent

greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库——gevent

gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行

由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

安装:

pip install gevent
gevent的使用
# gevent的使用import gevent, timefrom gevent import monkey# gevent 遇到耗时操作(time, sleep, accept, recv, 网络请求)会切换到其他协程执行代码# 打补丁,让gevent 能够识别耗时操作monkey.patch_all()# 任务1def work1():    for i in range(10):        print("work1")        # gevent.sleep(1)        time.sleep(1)def work2():    for i in range(10):        print("work2")        # gevent.sleep(1)        time.sleep(1)if __name__ == '__main__':    # 创建协程并指定执行的任务    g1 = gevent.spawn(work1)    g2 = gevent.spawn(work2)    # 让主线程等待协程执行完成以后程序再退出    g1.join()    g2.join()    # 注意点:如果程序一直运行,并且还有耗时操作,那么不需要使用join

个人独立博客:

微信公众号:TechBoard


转载地址:http://sayqa.baihongyu.com/

你可能感兴趣的文章
JSP标签JSTL的使用(1)--表达式操作
查看>>
SAP顾问的人脉比技术更为重要
查看>>
FI/CO PA考试试卷
查看>>
汽车介质应用非常严苛?没关系,新技术带来的高精度传感器十分适应!
查看>>
天合光能 - 用计算捕捉“光的能量”
查看>>
使用sysbench压力测试MySQL(一)(r11笔记第3天)
查看>>
css知多少(11)——position
查看>>
【Spring】定时任务详解实例-@Scheduled
查看>>
先有的资源,能看的速度看,不能看的,抽时间看。说不定那天就真的打不开了(转)...
查看>>
哪些领域适合开发微信小程序
查看>>
谁说数据库防火墙风险大?可能你还不知道应用关联防护
查看>>
ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
查看>>
怎样做一个企业?尤其是在这个互联网时代
查看>>
DVNA:Node.js打造的开源攻防平台
查看>>
17个案例带你3分钟搞定Linux正则表达式
查看>>
Java 8 比较器:如何对 List 排序
查看>>
苹果是否步思科后尘折戟中国
查看>>
漏洞预警!微软曝光震网三代漏洞,隔离网面临重大危机
查看>>
协鑫集成第二批1000台E-KwBe光伏储能设备即将启运澳洲
查看>>
爱立信物联网广州路演
查看>>