协程

协程

  • 1、是操作系统不可见的

  • 2、协程本质就是一条线程,多个任务在一条线程上来回切换

  • 3、利用协程这个概念实现的内容:来规避io操作,就达到我们将一条线程中的io操作降到最低的目的

  • 进程:数据隔离、数据不安全、操作系统级别、开销非常大、能利用多核

  • 线程:数据共享、数据不安全、操作系统级别、开销小、不能利用多核、一些和文件操作相关的io只有操作系统能感知到

  • 协程:数据共享、数据安全、用户级别、开销更小、不能利用多核、协程的所有的切换都是基于用户,只有在用户级别能够
    #感知到的io才会用协程

  • 用户级别的协程还有什么好处:

    • 1、减轻了操作系统的负担
    • 2、一条线程如果开了多个协程、那么给操作系统的印象是线程很忙、这样能多争取一些时间片来被CPU执行,程序的
      #效率就提高了

最简单的版本

from gevent import monkey
monkey.patch_all()
import time
import gevent

def fun():    #带有io操作的内容写在函数里,然后提交fun给gevent
    print('start fun')
    time.sleep(1)
    print('end fun')

g1 = gevent.spawn(fun)
g2 = gevent.spawn(fun)
g3 = gevent.spawn(fun)
gevent.joinall([g1,g2,g3])
g1.join() #阻塞,直到协程g1任务执行结束
g2.join() #阻塞,直到协程g2任务执行结束
g3.join() #阻塞,直到协程g3任务执行结束

asyncio

import asyncio


async def fun(name):
    print('start',name)
    # await 后面接可能会发生阻塞的方法
    #await 关键字必须写在一个async函数里
    await asyncio.sleep(1)
    print('end')

loop = asyncio.get_event_loop()
# loop.run_until_complete(fun('test'))#
loop.run_until_complete(asyncio.wait([fun('test1'),fun('test2')]))  #异步启用多个
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页