Python基础---协程

本文深入探讨了协程的概念及其在Python中的应用,对比线程和进程,协程具有更高的执行效率和资源控制能力。文章详细介绍了协程的优点,包括避免线程切换开销、简化共享资源管理,并通过实例演示了如何使用yield、greenlet和gevent模块实现协程,提高程序性能。

1.概念

协程:协助程序,线程和进程都是抢占式特点,线程和进程的切换我们是不能参与的。

而协程是非抢占式特点,协程也存在着切换,这种切换是由我们用户来控制的。

协程主解决的是IO的操作。

协程,又称微线程,纤程。英文名Coroutine。

2.优点

优点1

协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

优点2

不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

3.利用yield简单实现协程

代码示例:

部分结果:

4.greenlet模块

概念

greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator

greenlet模块

- gr1=greenlet(目标函数)

- gr1.switch() 切换执行

安装 

pip3 install greenlet。如果引入的时候还是报错,使用pycharm进行下载安装,

选择 file --> settings --> Project:项目名称 --> Project Interpreter-->…

代码练习

import time,greenlet
def test1():
    while True:
        print('....test1....')
        time.sleep(1)
        g2.switch()
def test2():
    while True:
        print('....test2....')
        time.sleep(1)
        g1.switch()
if __name__=="__main__":
    g1=greenlet.greenlet(test1)
    g2=greenlet.greenlet(test2)
    g1.switch()
    print('程序结束了')

结果:

5.gevent模块

代码:

import gevent,time
from gevent import monkey
#打补丁
monkey.patch_all()
#如果程序中没有耗时操作就顺序执行
def test1():
    for i in range(5):
        print('....test1....',i)
        time.sleep(1)#使用gevent.sleep()耗时操作
def test2():
    for i in range(5):
        print('....test2....',i)
        time.sleep(1)
if __name__=="__main__":
    g1=gevent.spawn(test1)#指定执行目标
    g2=gevent.spawn(test2)
    g1.join()#等待g1、g2指定的目标执行完后程序才往下执行
    g2.join()
    print('程序结束了')

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值