• 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("33[32;lm[producer]33[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')
    ])



  • 相关阅读:
    linux内核之情景分析mmap操作
    linux内核情景分析之匿名管道
    linux内核情景分析之命名管道
    linux内核情景分析之信号实现
    Linux内核情景分析之消息队列
    linux2.4内核调度
    聊聊程序的配置文件
    汽车引擎是怎么工作的
    Go对OO的选择
    为而不争
  • 原文地址:https://www.cnblogs.com/-nbloser/p/8729039.html
Copyright © 2020-2023  润新知