zoukankan      html  css  js  c++  java
  • 协程

    为什么要有协程?
            因为想要在单线程内实现并发的效果。
              因为CPthon有GIL锁,限制了在同一个时间点,只能执行一个线程
              所以想要在执行一个线程的期间,充分的利用CPU的性能
              所以才有了想在单线程内实现并发的效果。
            并发:切换+保存状态
            cpu是为什么要切换?
               1 因为某个程序阻塞了
               2 因为某个程序用完了时间片
               很明显  解决1 这个问题才能提高效率
            所以想要实现单线程的并发,就要解决在单线程内,多个任务函数中,某个任务函数遇见IO操作,马上自动切换到其他任务函数去执行。
    
         协程:是一个比线程更加轻量级的单位,是组成线程的各个函数
           协程本身没有实体
         greenlet模块:能简单的实现函数与函数之间的切换,但是遇到IO操作,不能自动切换到其他函数中
            (1) 注册一下函数func,将函数注册成一个对象f1
                  f1 = greenlet(func)
            (2) 调用func,使用f1.switch(),如果func需要传参,就在switch这里传即可
    
         gevent模块:可以实现在某函数内部遇到IO操作,就自动的切换到其他函数内部去执行
             g = gevent.spawn(func,参数) 注册一下函数func,返回一个对象g
             gevent.join(g) #等待g指向的函数func执行完毕,如果在执行过程中,遇到IO,就切换
             gevent.joinall([g1,g2,g3])#等待g1 g2 g3指向的函数func执行完毕
             
             进程,线程,协程
             计算密集用多进程,可以充分利用多核cpu的性能,
             IO密集用多线程(注意,协程是在单线程的)
           多线程和协程的区别是:
             线程是由操作系统调度,控制
             协程是由程序员自己调度,控制
  • 相关阅读:
    发送短信/邮件/打电话 code(转)
    如何学习算法
    堆和栈的区别
    2010 baidu笔试
    关于TableView中图片的延时加载(转)
    sqlite + UITableView 实现iPhone大数据浏览
    2010 Google中国笔试试题
    海量数据处理方法总结(转)
    IPhone WebApp 设计开发工具与资源(转)
    DynamicDataSet
  • 原文地址:https://www.cnblogs.com/god-for-speed/p/11719112.html
Copyright © 2011-2022 走看看