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

并发编程---协程

时间:2018-04-24 13:55:35      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:alt   %s   解决方法   传参数   sleep   col   cpu   自己的   传参   

协程

协程: 单线程下的并发,应用程序控制的并发,是用户自己调度的,自己控制自己的速度快。

并发: 切换任务+保存状态

单线程下实现并发:单线程下的多个任务,遇到IO就切,把单线程整体的IO降到最低。相当于把自己的IO伪装起来,让操作系统将更多的CPU分配给线程。程序用的cpu多,就叫执行效率高

总结协程特点:

  • 必须在只有一个单线程里实现并发
  • 修改共享数据不需加锁
  • 用户程序里自己保存多个控制流的上下文栈
  • 附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield、greenlet都无法实现,就用到了gevent模块(select机制))
技术分享图片协程

greenlet模块

  • 再多个任务可以很方便的切,但不能检测到,遇到IO 切
  • 比yield 好,但是还是不好,遇到io不会切

 

技术分享图片
from greenlet import greenlet
import time

def eat(name):
    print(%s eat1 %name)
    # time.sleep(10) 遇到IO不会切
    g2.switch(yang)
    print(%s eat2 %name)
    g2.switch()

def play(name):
    print(%s play1 %name)
    g1.switch()
    print(%s play2 %name)

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

g1.switch(yang) #第一次启动需要传参数
‘‘‘
打印结果:
yang eat1
yang play1
yang eat2
yang play2
‘‘‘
greenlet模块

 

gevent模块

gevent: 里面封装了greenlet模块,但是可以检测到IO操作,自动切换任务

缺点:只能检测到gevent.sleep()等,gevent的IO阻塞

解决方法:导入gevent模块下的monkey方法,在文件的开头写:from gevent import monkey;monkey.patch_all()

 

并发编程---协程

标签:alt   %s   解决方法   传参数   sleep   col   cpu   自己的   传参   

原文地址:https://www.cnblogs.com/Mryang123/p/8928987.html

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