python修炼12 -----协程

                    协               程                        

协程,又称微线程,纤程。英文名Coroutine。

优点1: 协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

优点2: 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

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

yield的简单实现

 

# 进程池Pool


# yield 简单实现协程

import time,queue
def consumer(name):
    print('--->reday to eat bao zi ..')
    while True:
        new_baozi=yield
        print("%s is eating baozi %s " %(name,new_baozi))
        time.sleep(1)

def producer():
    r=next(con)
    r=next(con2)
    n=0
    while 1:
        time.sleep(1)
        print('第 %s 个和第 %s 个包子被做好'%(n,n+1))
        con.send(n)
        con2.send(n+1)



if __name__ == '__main__':
    con=consumer('孝庄皇后')
    con2=consumer('大总管')
    p=producer()
--->reday to eat bao zi ..
--->reday to eat bao zi ..
第 0 个和第 1 个包子被做好
孝庄皇后 is eating baozi 0 
大总管 is eating baozi 10 个和第 1 个包子被做好
孝庄皇后 is eating baozi 0 
大总管 is eating baozi 10 个和第 1 个包子被做好
孝庄皇后 is eating baozi 0 
大总管 is eating baozi 10 个和第 1 个包子被做好
孝庄皇后 is eating baozi 0 
大总管 is eating baozi 1 
。
。
。
。
。
代码执行结果

 

     Greenlet

greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator

from greenlet import greenlet
def test1():
    print(12)
    gr2.switch()#------->切换gr2  挂起
    print("再次执行")

def test2():
    print(24)
    gr1.switch()

gr1=greenlet(test1)
gr2=greenlet(test2)
gr1.switch()
12
24
再次执行
View Code

Gevent

import gevent

import requests,time


start=time.time()

def f(url):
    print('GET: %s' % url)
    resp =requests.get(url)
    data = resp.text
    print('%d bytes received from %s.' % (len(data), url))

gevent.joinall([

        gevent.spawn(f, 'https://www.python.org/'),
        gevent.spawn(f, 'https://www.yahoo.com/'),
        gevent.spawn(f, 'https://www.baidu.com/'),
        gevent.spawn(f, 'https://www.sina.com.cn/'),

])

# f('https://www.python.org/')
#
# f('https://www.yahoo.com/')
#
# f('https://baidu.com/')
#
# f('https://www.sina.com.cn/')

print("cost time:",time.time()-start)

 

posted @ 2017-01-19 14:00  红领巾下的大刀疤  阅读(172)  评论(0编辑  收藏  举报
/* 看板娘 */