044协程

内容:协程  作用:实现高并发,提高效率
##################################################################
yield支持下的协程
协程是用户轻量级线程
好处:
1、没有线程切换
2、无需原子操作锁定及同步开销
3、高并发+高扩展+低成本:一个cpu支持上万的协程都没有问题。所以很适合高并发处理
缺点:
1、无法利用多核利用——通过多进程改进
2、一个阻塞,则全部都阻塞了

def consumer(name):
    print('start')
    while True:
        new_baozi = yield
        print("[%s]is eating baozi %s" % (name,new_baozi))

def producer():
    r = con.__next__()
    r = con2.__next__()
    n = 0
    while n < 5:
        n += 1
        con.send(n)
        con2.send(n)
        print("\033[32;lm[producer]\033[0m is making baozi %s" % n)

if __name__ == '__main__':
    con = consumer('c1')
    con2 = consumer('c2')

p = producer()

执行结果:
start
start
[c1] is eating baozi 1
[c2] is eating baozi 1
[c1] is eating baozi 2
[c2] is eating baozi 2
[c1] is eating baozi 3
[c2] is eating baozi 3
[c1] is eating baozi 4
[c2] is eating baozi 4
[c1] is eating baozi 5
[c2] is eating baozi 5

 

############################################################
gevent下的协程
1、安装

搜索gevent,然后安装

#####greenlet

from greenlet import greenlet
def test1():
    print(12)
    gr2.switch()
    print(34)
    gr2.switch()
def test2():
    print(56)
    gr1.switch()
    print(78)
gr1 = greenlet(test1)      # 建立对象
gr2 = greenlet(test2)
gr1.switch()     # 开始执行

执行结果:
12
56
34
78


######gevent

import gevent
def foo():
    print('running in foo')
    gevent.sleep()
    print('Explicit context switch to foo again')
def bar():
    print('Explicit context to bar')
    gevent.sleep()
    print('Implicit context switch back to bar')
    
gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(foo)
])

执行结果:
running in foo
Explicit context to bar
Explicit context switch to foo again
Implicit context switch back to bar

 

爬网站,可以明显看出串行和并发的效果

from  gevent import monkey
monkey.patch_all()
import gevent
from urllib.request import urlopen
def f(url):
    print('get:%s'%url)
    resp = urlopen(url)
    data = resp.read()
    print('%dbytesreceviedfrom%s.' % (len(data),url))
    with open('xx.html','wb') as f:
        f.write(data)
gevent.joinall([
    gevent.spawn(f,'https://www.baidu.com'),
    #gevent.spawn(f,'192.168.10.142'),
    #gevent.spawn(f,'192.168.10.142:8080')
])

 



 

posted @ 2018-04-06 21:48  Alos403  阅读(239)  评论(0编辑  收藏  举报