从coroutine说起

    按照正常的逻辑,函数是层级调用的,比如A调用B,B中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕,全过程由栈实现。如果你告诉我,A和B 2个函数可以一会执行下A里面几行代码,一会执行B几行代码,并且用单线程来实现,我只能承认这超出了我的认知,大学里C语言的函数调用栈还历历在目,我怎么都不曾想过会有这么诡吊的调用方式。

    协程,又叫微线程,生于1963年,最近几年才开始在某些语言中广泛使用,可谓是大器晚成。

def A():
    print '1'
    print '2'
    print '3'

def B():
    print 'x'
    print 'y'
    print 'z'

上面的代码,可能的执行结果:

1
x
2
y
3
z

这个结果就像是2个线程在分别执行一样,但是是单线程完成的,那么相对有多线程有何优势呢?

1. 执行效率,调用的切换由程序自身控制,没有了线程切换的开销。

2. 由于在单线程中完成,对变量的访问便没有了多线程中的锁机制,执行效率又提高了,比如2个线程同时写一个变量需要先等一个写完,等写锁释放后才能写,如果是协程就没有这种开销

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

那么python中有哪些利用协程的呢,令人匪夷所思的yield关键字就是干这个的。关于yield关键字,此文写的颇好,我自己记录下关键点,加深下印象:

1. 常用数据类型dict, list等都是Iterable,使用iter(iterable object)可以将iterable object变为iterator object即迭代器

2. generator是一种iterator,含有yield的function返回一个generator对象

3. next(), send(). next()执行generator至下一个yield处,返回yield表达式的值。send(value)将value作为yield表达式的值,然后执行至下一个yield表达式

你可能感兴趣的:(Python)