1.协程概念

  • 能够在一个线程下的多个任务之间来回切换,那么每一个任务就是协程

进程和线程的切换是由操作系统控制切换

  • 协程和线程
    #共同点:
       -线程和协程的创建,切换销毁都需要时间开销,
       -在cpython中线程和协程都不能利用多个cpu(只能并发)
    #不同点:
       -多线程线程的切换是由操作系统完成,而协程的切换是通过代码实现,操作系统不可见
       -多线程创建,切换销毁时间开销较大,协程的时间开销很小,携程切换用户可操作性,不会增加操作系统压力

2.协程操作(模块)

  • 线程切换

    • 两种切换方式

      两种切换方式
        # 原生python完成   yield asyncio
        # C语言完成的python模块 greenlet gevent
      • 原生python代码实现 (asyncos 模块)- asyncos利用yield记录线程代码执行状态和位置,但是yield不能规避io操作

      • C语言完成的PYthon模块(#greenlet模块)

  • 规避IO操作,切换原理(了解)

2.1 gevent 第三方模块

  • 基本格式

    import time
    import gevent
    from gevent import monkey
    monkey.patch_all() #用mokey模块使协程识别多次使用的外部方法,比如time.time()
    def eat():
       print('wusir is eating')
       time.sleep(1)
       print('wusir finished eat')

    def sleep():
       print('小马哥 is sleeping')
       time.sleep(1)
       print('小马哥 finished sleep')

    # g1 = gevent.spawn(eat)   # 创造一个协程任务
    # g2 = gevent.spawn(sleep)   # 创造一个协程任务
    # print(g1.value)
    # print(g2.value)
    # # g1.join()   # 阻塞 直到g1任务完成为止
    # # g2.join()   # 阻塞 直到g1任务完成为止
    # gevent.joinall([g1,g2,g3]) #知道列表内的协程任务全部终止为止
    g_l = []
    for i in range(10):
       g = gevent.spawn(eat)
       g_l.append(g)
    gevent.joinall(g_l)
  • 接收返回值

    • value

      # g1 = gevent.spawn(eat)  # 创造一个协程任务
      # g2 = gevent.spawn(sleep) # 创造一个协程任务
      # print(g2.value)

2.2 asyncio 内置模块(记住启动一个/多个线程)

  • async-异步 sync-同步

  • asyncio 协程基本格式

    #起一个任务

    import asyncio #插入asyncio模块
    async def demo(): #创建async函数
         print('start')
         await asyncio.sleep(1) #阻塞,阻塞必须写入await之后 且使用asyncio模块自己的方法
         print('end')
     loop = asyncio.get_event_loop()   #创建一个第三方事件循环,监测是否IO
     loop.run_until_complete(demo()) #吧demo任务丢到事件循环中去执行
#起多个任务,且没有返回值

import asyncio
 
async def demo():
   print('start')
   await asyncio.sleep(1) #阻塞,阻塞必须写入await之后 且使用asyncio模块自己的方法
   print('end')

loop = asyncio.get_event_loop()
wait_obj=asyncio.wait([demo(),demo(),demo()])
loop.run_until_complete(wait_obj)
  #起多个任务,有返回值,可以绑定回调函数
 
import asyncio
asrnc def demo():
print('start')
    await asyncio.sleep(1) #阻塞,阻塞必须写入await之后 且使用asyncio模块自己的方法
    print('end')
    retunrn 123
 
loop = asyncio.get-event_loop()
t1 = loop.create_task(demo())
t2 = loop.create_task(demo())
tasks=[t1,t2]
wait_obj=asyncio.wait([t1,t2])
loop.run_until_complete(wait_obj)
for i in easks:
print(tasks.result())
  • asyncos是python原生的底层的协程模块

    • 爬虫,webserver框架

    • 爬虫网络编程的效率和并发效果

  • await 阻塞必须写在await之后,告诉协程函数这里要切换出去,还能保证一会再切回来

  • await 必须写在async函数里,async是协程函数

  • loop 时间循环

    • 所有的协程的执行,调度都离不开这个loop

Python学习day1 初识python&环境安装的更多相关文章

  1. python学习之简介与环境安装

    [转自]http://www.cnblogs.com/wupeiqi/articles/5433925.html --Python可以应用于众多领域 如:数据分析.组件集成.网络服务.图像处理.数值计 ...

  2. python入门灵魂5问--python学习路线,python教程,python学哪些,python怎么学,python学到什么程度

    一.python入门简介 对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入门灵魂5问--python学习路线,python教程,python学哪些,pyth ...

  3. python学习第一讲,python简介

    目录 python学习第一讲,python简介 一丶python简介 1.解释型语言与编译型语言 2.python的特点 3.python的优缺点 二丶第一个python程序 1.python源程序概 ...

  4. 孤荷凌寒自学python第二十一天初识python的类

    孤荷凌寒自学python第二十一天初识python的类 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 类是面向对象的编程语言非常重要的概念. 编程语言的进化史中从顺序编程到结构化编程,最后才 ...

  5. python学习第九讲,python中的数据类型,字符串的使用与介绍

    目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...

  6. python学习第五讲,python基础语法之函数语法,与Import导入模块.

    目录 python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 1.函数语法定义 2.函数的调用 3.函数的文档注释 4.函数的参数 5.函数的形参跟实参 6.函 ...

  7. python学习第三讲,python基础语法之注释,算数运算符,变量.

    目录 python学习第三讲,python基础语法之注释,算数运算符,变量. 一丶python中的基础语法,注释,算数运算符,变量 1.python中的注释 2.python中的运算符. 3.pyth ...

  8. Python学习教程(Python学习视频_Python学些路线):Day06 函数和模块的使用

    Python学习教程(Python学习视频_Python学些路线):函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. $$x_1 + x_2 + x ...

  9. ELK-6.5.3学习笔记–elk基础环境安装

    本文预计阅读时间 13 分钟 文章目录[隐藏] 1,准备工作. 2,安装elasticsearch. 3,安装logstash. 4,安装kibana 以往都是纸上谈兵,毕竟事情也都由部门其他小伙伴承 ...

随机推荐

  1. [转帖]system()、exec()、fork()三个与进程有关的函数的比较

    system().exec().fork()三个与进程有关的函数的比较 https://www.cnblogs.com/qingergege/p/6601807.html 启动新进程(system函数 ...

  2. 设计模式之原型模式(c++)

    问题描述 看到这个模式,很容易想到小时候看的<西游记>,齐天大圣孙悟空发飙的时候可以通过自己头上的 3 根毛立马复制出来成千上万的孙悟空, 对付小妖怪很管用(数量最重要). Prototy ...

  3. Flutter路由管理

    第一点:push使用 1.pushNamed——Navigator.of(context).pushNamed('routeName'); 此种方法只是简单的将我们需要进入的页面push到栈顶,以此来 ...

  4. Python 爬虫 解析库的使用 --- XPath

    一.使用XPath XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所 ...

  5. centos安装Tesseract

    yum安装(推荐) yum search tesseract yum install tesseract.x86_64 -y pip3 install pytesseract pip3 install ...

  6. Maven 项目 查找指定包的引用位置

  7. 用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则

    转载请注明出处:http://www.codelast.com/ line search(一维搜索,或线搜索)是最优化(Optimization)算法中的一个基础步骤/算法.它可以分为精确的一维搜索以 ...

  8. mobile deeplearning

    框架: 腾讯ncnn https://github.com/Tencent/ncnn 百度mobile-deep-learning https://github.com/baidu/mobile-de ...

  9. 训练赛-Building Numbers

    题意:首先告诉你,一个数字从1开始有两种变换方式:1.当前数字的值加1 2.当前的数字值乘2: 思路:首先把数组里的数字需要的变换次数算出来,然后用前缀和解决: 代码: #include<ios ...

  10. HTML5-canvas-基础篇

    <canvas>新元素 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. <canvas> 标签只是图形容器,您必须使用脚本来 ...