zoukankan      html  css  js  c++  java
  • 多并发之协程

    协程

    什么是协程?

    协程就是单线程下实现并发。是由用户自己控制调度的,也就是说需要在应用程序里实现。

    协程的实现

    Greenlet模块

    from greenlet import greenlet
    import time

    def eat(name):
    print('%s eat 1'%name)
    g2.switch('rose')
    print('%s eat 2'%name)
    g2.switch()
    def play(name):
    print('%s play1'%name)
    g1.switch()
    print('%s play2'%name)

    g1 = greenlet(eat)
    g2 =greenlet(play)

    g1.switch('lucy')

     

    lucy eat 1

    rose play1

    lucy eat 2

    rose play2

     

    Greenlet可以很方便地实现切换,但是他不会监测IO,不能实现IO阻塞就切换。

    Gevent模块

    import gevent

    def eat(name):
    print('%s eat 1' % name)
    gevent.sleep(2)
    print('%s eat 2' % name)


    def play(name):
    print('%s play' % name)
    gevent.sleep(2)
    print('%s play' % name)


    g1 = gevent.spawn(eat, 'lucy')
    g2 = gevent.spawn(play, 'lile')

    g1.join()
    g2.join()

     

    lucy eat 1

    lile play

    lucy eat 2

    lile play

     

    Gevent模块提高了执行效率,实现了并发操作,但是gevent.sleep()就可以监测自身,如果把这个改成time.sleep()就不会切换任务了,但是gevent下有个宝贝:

    from gevent import monkey;monkey.patch_all()
    import gevent
    import time
    def eat(name):
    print('%s eat 1' % name)
    time.sleep(2)
    print('%s eat 2' % name)


    def play(name):
    print('%s play' % name)
    time.sleep(2)
    print('%s play' % name)


    g1 = gevent.spawn(eat, 'lucy')
    g2 = gevent.spawn(play, 'lile')

    # g1.join()
    # g2.join() # 等待执行完才结束进程

    gevent.joinall([g1,g2]) # 同上,等待所有

    就把IO阻塞变成非阻塞,但是一定要在文件开头写上。

  • 相关阅读:
    JQuery.Ajax()的data参数类型
    通过拖动表格行进行行排序
    jquery animate()背景色渐变的处理
    JavaScript代码不执行
    Java性能调优笔记
    tika提取pdf信息异常
    Solr字段配置错误
    Oracle查询字符集
    zookeeper中Watcher和Notifications
    zookeeper适用场景:分布式锁实现
  • 原文地址:https://www.cnblogs.com/yuliangkaiyue/p/9759117.html
Copyright © 2011-2022 走看看