鱼C论坛

 找回密码
 立即注册
查看: 1631|回复: 5

[已解决]想让大佬看看我的协程异步哪里出错了!

[复制链接]
发表于 2021-3-3 23:21:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
帮忙看看我的程序,同样的需求,用异步和同步花的时间是一样的!

import time
import requests
from lxml import etree
import asyncio
start = time.time()
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}

#获取协程
async def landscape(url):
    landscape_page = requests.get(url=url,headers=headers).text
    land_tree = etree.HTML(landscape_page)
    landscape_li = land_tree.xpath('//div[@class="slist"]/ul/li')
    for landscape_li in landscape_li:
        land_url = landscape_li.xpath('./a/img/@src')
        land_str = ''.join(land_url) #将列表转换成字符
        land_right_url = 'http://pic.netbian.com' + land_str

        land_name = landscape_li.xpath('./a/img/@alt')
        land_right_name = ''.join(land_name) + '.jpg' #将名称列表转化名称字符
        landscape_png = requests.get(url=land_right_url, headers=headers).content
        with open(r'C:\Users\Administrator\Desktop\4k风景\{}'.format(land_right_name), 'wb') as fp:
            fp.write(landscape_png)
            print(land_right_name + '下载成功!')

#获取所有风景页面的url
urls = []
for num in range (2,6):
    landscape_url = 'http://pic.netbian.com/4kfengjing/index_'+str(num)+'.html'
    urls.append(landscape_url)

#获取task任务对象,并且将协程对象封装到任务对象
tasks = []
for url in urls:
    xiecheng = landscape(url)
    task = asyncio.ensure_future(xiecheng)
    tasks.append(task)

#事件环
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

end = time.time()
print(end - start)
最佳答案
2021-3-4 09:17:57
requests换成aiohttp模块就可以了(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-4 09:10:40 | 显示全部楼层
可能是因为GIL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-4 09:17:20 | 显示全部楼层
分析了一下代码里最花费时间的是requests.get和open
这两个函数能await吗 如果不能await根本不能节省时间
就像是time.sleep和await asyncio.sleep, 后者才能节省时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-4 09:17:57 | 显示全部楼层    本楼为最佳答案   
requests换成aiohttp模块就可以了(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-4 20:14:29 | 显示全部楼层
我今晚试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-5 00:11:26 | 显示全部楼层
问题已解决,使用aiohttp模块发起请求即可,记得挂起哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 07:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表