首页 > 编程语言 >Python爬虫-第四章-2-协程与异步

Python爬虫-第四章-2-协程与异步

时间:2023-01-18 10:37:41浏览次数:39  
标签:__ 异步 协程 Python time print async asyncio

协程:

       单线程执行多任务执行时,当执行中程序处于I/O期间,异步可以让CPU选择性的切换到其他任务上

# Demo Describe:协程

import asyncio
import time

'''
协程所针对的问题:
1.类似input()或timeSleep函数,在程序运行中等待输入命令期间线程处于阻塞状态
2.类似requests.get(url)等网络请求时,在等待网络数据返回期间线程处于阻塞状态
问题总结:
一般情况下,当程序处于同步IO操作(input/output)时,线程处于阻塞状态,CPU不对当前程序负责,程序运行效率低下



# start--------1,简单示例----------------------
async def fun1():
print('fn1')
# time.sleep(3) # 同步操作
await asyncio.sleep(3) # 异步
print('fn1')


async def fun2():
print('fn2')
# time.sleep(2) # 同步操作
await asyncio.sleep(2) # 异步
print('fn2')


async def fun3():
print('fn3')
# time.sleep(4) # 同步操作
await asyncio.sleep(4) # 异步
print('fn3')


async def main():
f1 = asyncio.create_task(fun1())
f2 = asyncio.create_task(fun2())
f3 = asyncio.create_task(fun3())
task = [f1, f2, f3]
await asyncio.wait(task)


if __name__ == '__main__':
timeStart = time.time()
asyncio.run(main())
timeEnd = time.time()
print('程序执行时间:', timeEnd - timeStart)
'''
同步操作:
fn3
fn3
fn2
fn2
fn1
fn1
程序执行时间: 9.007003545761108
协程异步操作:
fn3
fn2
fn1
fn2
fn1
fn3
程序执行时间: 3.989386796951294
'''

# end--------1,简单示例----------------------

异步

# Demo Describe:aiohttp 异步Http请求操作

import aiohttp
import asyncio
import aiofiles as aiof

'''
本章内容:
requests.get()同步 变为 异步操作aiohttp
'''

urls = [
'https://pic.3gbizhi.com/2022/0402/20220402083510539.jpg',
'https://pic.3gbizhi.com/2021/1203/20211203082607923.jpg',
'https://pic.3gbizhi.com/2021/0928/20210928055411375.jpg'
]


async def AioDownLoad(url):
name = url.rsplit('/', 1)[1] # rsplit right 从右边切割
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
content = await resp.content.read()
async with aiof.open(f'../FileForDemo/Pic3gbizhi/{name}.jpg', mode='wb') as file:
await file.write(content)
print('下载完毕!!!')


async def main():
tasks = []
for i in urls:
tasks.append(asyncio.create_task(AioDownLoad(i)))
await asyncio.wait(tasks)


if __name__ == '__main__':
asyncio.run(main())

标签:__,异步,协程,Python,time,print,async,asyncio
From: https://blog.51cto.com/mooreyxia/6019020

相关文章

  • python方法(函数)
    定义格式def方法名(参数1,参数2,参数3):#具体实现return#返回值参数默认值defdesc(name='no-name',age=0):print("%s%d"%(name,age))#调用desc......
  • python序列
    类似于Java和C的数组,但python的”数组“可操作性更强,以下是常用APIinsert指定位置插入arr=[0,1,20,3,40,5,60,7,80,9]#下标1位置后加入值,结果[0,1,81,......
  • python pip实用手册
    pip是python的包安装工具,类似于JavaScript的npm和yarn设置国内源国内源清华https://pypi.tuna.tsinghua.edu.cn/simple阿里http://mirrors.aliyun.com/pypi/simpl......
  • 【Python】爬虫笔记-开源代理池haipproxy使用
    大规模的数据采集需要用到代理池来突破IP封锁。一般代理池的构建是先爬取网上的免费代理,校验后存到数据库中,再提供给其他程序api。github上有很多现成的代理池能拿来用,在......
  • python基础: 流程控制
    目录流程控制1.流程控制的理论知识2.需要注意的知识点3.流程控制之分支结构流程控制1.流程控制的理论知识概念:就是按照一定的步骤来实现某些功能的语句,事物的流程控......
  • 正则表达式在python中的应用
    基本语法元字符.匹配除换行符外任意一个字符[a-z]一个字母字符[^a-z]一个非字母字符[0-9]一个数字字符[^0-9]一个非数字字符\b匹配单词......
  • 阻塞&非阻塞 同步&异步的区别
    https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247526626&idx=4&sn=21178025390cbb53d2e89c918340e747&chksm=fbb1e11cccc6680a9ba746e7c092ce34e82ba9c786c251......
  • Day01-Python环境安装
    一、Python简介1、开源代码是公开的,任何人都可以去查看,修改以及使用。2、版本包括CPython(由C编写,把python编译成中间态的字节码,然后有虚拟机解释),Jthon(将python代码编译......
  • python基础: 数据类型及其内置方法、类型转换
    目录基本数据类型数据类型的概述1.数据类型之整形--int2.数据类型之浮点型--float3.数据类型之字符型,也称字符串类型--str4.数据类型之列表--list5.数据类型之字典--dict6.......
  • 通过 Python 来调用 Shell 脚本的三种常用方式
    如何通过Python来调用Shell脚本本文介绍三种写法使用os.system来运行使用subprocess.run来运行使用subprocess.Popen来运行三种方式的优缺点os.syste......