python协程和线程,python异步协程

  python协程和线程,python异步协程

  共加工,也称为微螺纹,纤维。英文名Coroutine。

  协同学的概念很早就提出来了,但直到最近几年才在一些语言(如Lua)中广泛使用。

  子程序或函数是所有语言中的层次调用。比如A调用B,B在执行过程中调用C。c执行完返回,B执行完返回,最后A执行完。

  所以子程序调用是通过堆栈实现的,一个线程只是执行一个子程序。

  子例程调用总是一个入口一个返回,调用顺序很明确。协程的调用不同于子程序。

  协同进程看起来像一个子程序,但是在执行的过程中,可以在子程序内部中断,然后由其他子程序代替执行,然后在适当的时候返回。

  注意,在一个子程序中中断执行其他子程序不是函数调用,有点类似CPU中断。例如,子程序A和B:

  德发():

  打印 1

  打印“2”

  打印“3”

  defB():

  打印“x”

  打印“y”

  假设打印“z”由协调流程执行。在执行A的过程中,可以随时中断执行B. B也可能在执行过程中中断然后执行A .结果可能是:

  一个

  2

  x

  y

  三

  但是Z在A中并不调用B,所以协程的调用比函数的调用要难理解一点。

  看起来A和B的执行有点像多线程,但是协同线程的特点是由一个线程执行。与多线程相比,协同线程的优势在哪里?

  优点是协调流程的执行效率极高。因为子程序切换不是线程切换,而是由程序本身控制,所以没有线程切换的开销。与多线程相比,线程越多,协程的性能优势就越明显。

  第二个好处是不需要多线程锁机制,因为只有一个线程,同时写变量不会有冲突。协调过程中只需要判断控制共享资源时的状态,所以执行效率远高于多线程。

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

  对Python协程的支持仍然非常有限。生成器中使用的yield可以在一定程度上实现协同程序。虽然支持不全,但已经可以发挥相当大的威力了。

  看看这个例子:

  传统的生产者-消费者模型是一个线程写消息,另一个线程取消息,队列和等待由锁机制控制,但一不小心就可能发生死锁。

  如果切换到协同学,生产者产生消息后,会直接通过yield跳转到消费者开始执行。消费者完成执行后,会切换回生产者继续生产,效率极高:

  importtimedefconsumer():

  r=

  whileTrue:

  n=yieldrifnotn:return

  打印([消费者]消费%s . %n)

  时间.睡眠(1)

  r=200OKdefproduce(c):

  c .下一个()

  n=0

  whilen5:

  n=n 1

  打印([制作人]正在制作%s . %n)

  r=c.send

  打印([PRODUCER]consumer return :% s % r )

  c . close()if _ _ name _ _== _ _ main _ _ :

  c=消费者()

  执行产生的结果(c):

  请注意,消费者函数是一个生成器。将消费者转化为产品后:

  首先调用c.next()启动生成器;

  然后一旦有东西产生,通过c.send(n)切换到消费者执行;

  消费者通过yield获取消息,进行处理,然后通过yield发回结果;

  生产者得到消费者处理的结果,并继续产生下一条消息;

  Produce决定不生产,通过c.close()关闭了消费者,整个过程结束。

  整个进程由一个线程解锁并执行。生产者和消费者合作完成任务,所以称为“协同进程”,而不是线程的抢占式多任务。

  最后,用Donald Knuth的一句话来概括协同过程的特点:

  "子程序是协同程序的一个特例."

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: