Python网络编程——协程

协程的概念

协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在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

最后

以上就是小编所分享的内容,喜欢的话可以加个关注,希望能够帮助到大家,仅供参考。
我自己整理了一套最新的python系统学习教程,从基础到实战,实用性都很高,可以免费送给大家,进python学习交流群:851211580 即可免费领取。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值