码迷,mamicode.com
首页 > 其他好文 > 详细

044协程

时间:2018-04-06 23:41:48      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:run   foo   一个   res   html   port   event   read   send   

内容:协程  作用:实现高并发,提高效率
##################################################################
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‘)
])

 



 

044协程

标签:run   foo   一个   res   html   port   event   read   send   

原文地址:https://www.cnblogs.com/-nbloser/p/8729039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!