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. pl/sql实现打印九九乘法表

    学习PL/SQL循环的时候写的,记录一下. declare v_number1 ); -- 外层循环变量 v_number2 ); -- 内层循环变量 begin .. -- 开始外层循环 loop ...

  2. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  3. (自用 )npm --save和--save-dev区别

    https://blog.csdn.net/playboyanta123/article/details/78349034(原文) 目前大多数基于vue的项目都是用vue-cli 创建的.当创建项目完 ...

  4. jq简单仿上传文件

    html: <div> <input id="lefile" type="file" style="display:none&quo ...

  5. python之路--FTP 上传视频示例

    # 服务端 import json import socket import struct server = socket.socket() server.bind(('127.0.0.1',8001 ...

  6. python设计模式第二十四天【命令模式】

    1.使用场景 (1)调用过程比较繁琐,需要封装 (2)调用参数需要进行处理封装 (3)需要添加额外的功能,例如,日志,缓存,操作记录等 2.代码实现 #!/usr/bin/env python #! ...

  7. Keepalived+LVS高可用负载均衡集群

    概述 Keepalived是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(HeathChecking)功能——判断LVS负载调度器.节点服务器的可用性,及 ...

  8. Android中HttpURLConnection对象是怎么生成的

    try { URL mUrl = new URL("https://www.jianshu.com/"); HttpURLConnection http = (HttpURLCon ...

  9. 洛谷P2320鬼谷子的钱袋.

    题目 这个题考察二进制分解. \(Code\) #include <bits/stdc++.h> #pragma GCC optimize(2) #pragma GCC optimize( ...

  10. 「中国剩余定理CRT」学习笔记

    设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...