协程介绍

先了解进程和线程:

让计算机能够同时处理多个任务,操作系统有了进程的概念,而且在进程内部,基本可以认为当前系统只有一个进程在运行,操作系统对此作了非常好的封装。进程间的切换是由操作系统来完成的。

进程有一个问题,就是进程间切换耗费计算机资源非常大,而且申请一个新的进程的成本也非常高。所以后来就有了线程,它生成的成本和切换的消耗都比进程要低很多,而且线程间通信也非常方便。

线程的问题是:

1)存在线程安全问题,出了问题非常不易定位。

2)进程内部有线程数目的限制。

3)随着并发量的增加,线程生成和切换的成本也变得昂贵。

 

看看协程是如何解决这些问题的:

1)协程的生成成本更低。其实就是一块内存,记录之前的调用的栈信息。你甚至可以通过控制函数调用的层次来进一步降低协程的大小。要生成一个协程,只需要申请一块内存并赋值。

2)切换更快。基本是就是内存的拷贝的速度。

3)没有线程安全问题。一个进程内可以同时存在多个协程,但是只有一个协程是激活的,而且协程的激活和休眠时程序员通过编程来控制,而不是内核来控制的。这样就没有了线程安全问题。

4)可读性更好。相对于IO多路复用来说,你调用的服务接口或者IO接口是异步的,但是你的代码是流畅(顺序)的,并没有被异步和回调打乱。协程也是异步的,但是它会把异步的事件和回调封装起来,形成类似远程调用接口。


Python的协程实现:

yield可以实现协程。另外,还有很多第三方的版本,比如greenlet。


协程可以用来做什么?

1)描述逻辑:我主要把协程用来描述逻辑。一个流程可能需要调用多个接口,其中很多接口是异步的。这样描述起来会困难一点。用线程是可以解决部分问题,但是复杂度提升。

2)提高并发:主要应用在IO密集型应用中。gevent就是在greenlet基础之上的一个处理并发的框架,和上面的区别是,这里的事件及接口是IO接口。


缺陷:

无法使用多核。不过可以通过进程+协程来解决。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Python协程,我来简单介绍一下它的概念和使用方法。 Python协程指的是使用生成器(generator)实现的协程,通过yield关键字实现协程的暂停和恢复。协程的使用可以有效地提升Python程序的并发性能,特别是在IO密集型任务中,协程可以大大减少线程切换的开销。 下面是一个简单的Python协程示例: ```python def coroutine(): while True: value = yield print('Received value:', value) c = coroutine() next(c) c.send(10) c.send('Hello') ``` 在这个示例中,我们定义了一个名为coroutine的生成器函数,其中使用了yield关键字来暂停和恢复协程的执行。在主程序中,我们首先通过next(c)来启动协程的执行,然后使用c.send(value)来向协程发送数据,协程会在yield处暂停执行,并打印接收到的数据。 除了使用yield关键字来实现协程,Python还提供了async/await关键字来更方便地编写协程。使用async/await可以将协程的代码看作是顺序执行的,而不需要手动调用生成器的方法。 下面是一个使用async/await关键字的协程示例: ```python async def coroutine(): while True: value = await asyncio.sleep(1) print('Received value:', value) asyncio.run(coroutine()) ``` 在这个示例中,我们使用async/await关键字定义了一个名为coroutine的协程函数,并在其中使用await asyncio.sleep(1)来模拟协程的IO操作,每秒钟打印一次接收到的数据。然后在主程序中使用asyncio.run()方法来启动协程的执行。 需要注意的是,Python协程的使用需要结合asyncio库来进行,asyncio提供了事件循环(event loop)、协程调度器、异步IO等功能,可以方便地实现协程的并发调度和异步IO操作。 希望这些信息对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值