首页 > 其他分享 >13、爬虫-协程-asyncio和异步操作-aiohttp

13、爬虫-协程-asyncio和异步操作-aiohttp

时间:2024-07-01 22:32:03浏览次数:19  
标签:__ 异步 13 协程 aiohttp await asyncio

概念:当程序sleep或者input、output等待的时候、cpu是处于堵塞状态的、cpu此时是不再为我们的代码服务的、所以协程就是当遇到了前面这种情况的时候可以选择性的切换到其他任务上

 

同步协程:asyncio

当程序在睡眠的时候注意加上:

await asyncio.sleep(2)
"""
多任务协程asyncio

"""

import asyncio
import time


async def func1():
    print("异步1")
    #time.sleep(2)   #同步操作、当程序出现了同步操作的时候、异步就中断了
    await asyncio.sleep(2) #异步操作代码 \ await 表示挂起2s、将程序切换到执行其它代码
    print("异步1")

async def func2():
    print("异步2")
    #time.sleep(2)
    await asyncio.sleep(2)
    print("异步2")

async def func3():
    print("异步3")
    #time.sleep(2)
    await asyncio.sleep(2)
    print("异步3")

#异步协程函数
async def main():
    # #第一种写法(不推荐)
    # f1 = func1()
    # await f1 #一般await挂起操作放在协程对象前面
    #第二种写法(推荐)
    tasks = [
        #在python11后需要将协程对象包含在 asyncio.create_task()里面
        asyncio.create_task(func1()),
        asyncio.create_task(func2()),
        asyncio.create_task(func3())
        
        #python8之前可以这样写
        # func1(),
        # func2(),
        # func3()
    ]

    await asyncio.wait(tasks)


if __name__ == '__main__':

    time1 = time.time()
    #一次启动多个任务(协程)
    asyncio.run(main())
    time2 = time.time()

    print(time2 - time1)    #异步协程执行三个函数只需2秒

 

异步操作:aiohttp

案例:使用异步协程下载多个图片

"""
异步操作
aiohttp
pip install aiohttp

requests.get() 是一个同步的请求、需要将其换为异步请求

"""

import asyncio
import aiohttp  #pip install aiohttp


#案例下载三张图片
urls = [
    "https://www.keaitupian.cn/cjpic/frombd/2/253/2164177160/3074906821.jpg",
    "https://www.keaitupian.cn/cjpic/frombd/2/253/3564686522/2864443333.jpg",
    "https://www.keaitupian.cn/cjpic/frombd/1/253/351679977/2120764836.jpg"
]
async def aiodownload(url):
    #截取urls的最后的一串最为图片名
    pic_name = url.rsplit("/", 1)[1]  #从右边开始切,切一次、得到[1]的位置内容

    #这里的aiohttp.ClientSession() 表示创建会话 相当于  requests.get()  或  requests.post()对象一样
    #request = aiohttp.ClientSession()
    #注意这里的with .... as ..:与打开文件的方式一样、打开连接后会自动关闭.close连接
    async with aiohttp.ClientSession() as session:    #获取会话
        async with session.get(url) as  response:   #请求url 连接(相当于requests.get())
            # response.text()  #读文本
            # response.content() #读二进制文本内容
            # response.json() #读json内容
            #将请求到的内容写入到文件中
            with open(pic_name ,"wb") as file:
                file.write(await response.content.read())   #这里读取的内容是异步的、所以需要await挂起
    print(pic_name,"done")
    #发送图片请求
    #得到图片内容
    #保存到文件


async def main():
    tasks = []
    for url in urls:
        tasks.append(aiodownload(url))

    await asyncio.wait(tasks)


if __name__ == '__main__':
    #asyncio.run(main())    #使用这个去循环会报错RuntimeError: Event loop is closed、替换为下面的即可
    loop = asyncio.get_event_loop()     #创建新的事件循环
    loop.run_until_complete(main())     #使用新的事件循环去只需异步任务

 

标签:__,异步,13,协程,aiohttp,await,asyncio
From: https://www.cnblogs.com/littlecc/p/17978201

相关文章

  • 14、爬虫-异步协程爬取西游记小说-aiohttp-aiofiles
     注意:有关所有的IO操作都要加上:await挂起 """https://dushu.baidu.com/pc/detail?gid=4306063500#小说网站https://dushu.baidu.com/api/pc/getCatalog?data={%22book_id%22:%224306063500%22}#可以拿到每个章节的bookid、cid(每个章节的id)、这里%22相当于"号htt......
  • 13.计数器设计、标志脉冲信号的使用
    (1)设计定义:设计一个计数器模块,实现每0.5秒跳转一次的功能,可以用LED灯的翻转来体现,要求初始状态为LED熄灭。(2)visio视图:(3)Verilog代码:modulecounter(clk,reset_n,led_out);inputclk;inputreset_n;outputregled_out;//0.5s=500_000_000ns=......
  • 研0 冲刺算法竞赛 day8 P1303 A*B Problem
    思路:用char[]存储输入,后用int[]逐位计算,根据乘法计算规则错位相加,用数组存储,然后考虑进位,最后倒序输出代码:#include<iostream>#include<cstring>usingnamespacestd;chara1[10001],b1[10001];inta[10001],b[10001],c[10001];intmain(){ cin>>a1>>b1; for......
  • 孩子厌学怎么办?13年老教师提醒:4个步骤,让孩子重新爱上学习
    随着学校课程内容越来越多,学生面临的压力也越来越大,孩子也出现了不想上学的情况。而往往学习成绩迟迟上不去只是不想上学的原因之一、感情不顺利、和同学关系处理不好、在学校遭到了孤立等等,都会成为孩子不想上学的原因,不想上学也成了令很多家长头痛的事。很多家长面......
  • 打卡信奥刷题(208)用Scratch图形化工具信奥P8605 [普及组][蓝桥杯 2013 国 AC] 网络寻路
    [蓝桥杯2013国AC]网络寻路题目描述XXX国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地......
  • CF1375D Replace by MEX 题解
    题目大意令mexmexmex为序列中最小的没有出现的数。给你一个长度为......
  • RK3568 android13 预置APK
    现象:需要预置一个测试APK,按照以往得方法,将APK放到device/rockchip/rk356x/rk3568_t/preinstall目录下面。然后编译成新得固件。发现桌面没有显示APK。 查看OUT目录下面有预置得APK,out/target/product/rk3568_t/odm/bundled_persist-app/autotest/autotest.apk。说明APK是有......
  • 百分浏览器Cent Browser v5.1.1130.129 正式版
    软件简介百分浏览器是基于Chrome内核开发的,因此在界面设计上与Chrome非常相似。它不仅继承了Chrome的稳定性和流畅性,还增加了一些Chrome没有的功能。例如,百分浏览器提供了更好的内存管理方法,可以减少内存占用,这对于经常使用大量标签页的用户来说是一个重要的优势。此外,它还......
  • LeetCode 1013. Partition Array Into Three Parts With Equal Sum
    原题链接在这里:https://leetcode.com/problems/partition-array-into-three-parts-with-equal-sum/description/题目:Givenanarrayofintegers arr,return true ifwecanpartitionthearrayintothree non-empty partswithequalsums.Formally,wecanpartition......
  • X波段9.5-13.3GHz 方案PK
    EMM5068VU 高频微波功率放大器X波段9.5-13.3GHzEMM5068VU:BroadBand:9.5to13.3GHz 2WFEATURES・HighOutputPower:Pout=33.0dBm(typ.)・HighLinearGain:GL=26.0dB(typ.)・BroadBand:9.5to13.3GHz・ImpedanceMatchedZin/Zout=50ohm・SmallHermetic......