协程基础——理论

定义: 纤程,微线程。协程的本质是一个单线程程序,所以协程不能够使用计算机多核资源。
作用:
  能够高效的完成并发任务,占用较少的资源,因此协程的并发量较高
原理:通过记录应用层的上下文栈区,实现在运行中进行上下文跳转,达到可以选择性的运行想要运行的部分,
    以此提高程序的运行效率

优点: 

  1 消耗资源少

  2 无需切换开销

  3 无需同步互斥

  4 IO并发性好

缺点:

  1 无法利用计算机多核

yilde --> 协程实现的基本关键字

有两个 第三库可以实现协程 

  1 greenlet

    g = greenlet.greenlet()

      g.switch()  选择要执行的协程事件

      

import greenlet
def a_1(num):
    print('1',num)
    g2.switch()
    print('2')
    g2.switch()
def a_2():
    print('3')
    g1.switch()
    print('4')
g1 = greenlet.greenlet(a_1)
g2 = greenlet.greenlet(a_2)
g1.switch(10)
View Code ----greenlet

  2 gevent  

    1 将协程事件封装为函数

    2 生成协程对象

     gevent.spawn(func,argv)

      功能:生成协程对象

      参数: func 协程函数

          argv 给协程函数传参

      返回值:返回协程对象

    3 回收协程:

      gevent.joinall()

        功能:回收协程

        参数:列表  将要回收的协程放入列表

      geventt.sleep()

        功能:设置协程阻塞,让协程跳转

        参数:n 阻塞时间      

import gevent,time
def foo(a,b):
    print(a,b,'这是A,B')
    gevent.sleep(2)
    print('foo,again')

def bar():
    print('run...')
    gevent.sleep(3)
    print('run bar againg')

f = gevent.spawn(foo,1,2)
g = gevent.spawn(bar)
time.sleep(2)
print('----')
gevent.joinall([f,g])
View Code--gevent

      from gevent import monkey

       monkey.patch_all()

        功能:修改套接字的IO阻塞行为

        *必须在socket导入之前使用

下文介绍是进程和协程一起使用示例

https://blog.csdn.net/zhongbeida_xue/article/details/53406915#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2751b6d1   python中多进程+协程的使用以及为什么要用它

          

原文地址:https://www.cnblogs.com/Skyda/p/9664649.html