py异步+异步爬取

import asyncio

"""
在这个例子中,main()方法使用asyncio.ensure_future()方法创建了两个任务,
然后将它们放入了一个列表中。最后,通过在asyncio.gather()方法前加上*,
将列表中的任务解包为单独的参数,然后同时运行这些任务。

注意,asyncio.ensure_future()方法会将协程包装为一个Task对象,
这个对象可以用于取消协程或获取协程的状态。
"""
async def coroutine1():
    await asyncio.sleep(1)
    print("Hello from coroutine 1!")

async def coroutine2():
    await asyncio.sleep(2)
    print("Hello from coroutine 2!")

async def main():
    tasks = [
        asyncio.ensure_future(coroutine1()),
        asyncio.ensure_future(coroutine2())
    ]
    await asyncio.gather(*tasks)

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())
# 程序遇见了io操作阻塞,可以选择性切换到其他任务上
# 在微观上是一个任务一个任务的切换, 宏观上多个任务一起执行
# 多任务异步操作
# 都是在单线程的条件下

# ==========================
# 实现协程
import time
import asyncio

async def fun():
    print("你好")

async def fun1():
    print("你好1")
    await asyncio.sleep(4)
    print("你好1")

async def fun2():
    print("你好2")
    await asyncio.sleep(2)
    print("你好2")

async def fun3():
    print("你好3")
    await asyncio.sleep(3)
    print("你好3")
async def m():
    # 运行多个协程
    task1 = asyncio.ensure_future(fun1())
    task2 = asyncio.ensure_future(fun2())
    task3 = asyncio.ensure_future(fun3())
    await asyncio.gather(task1, task2, task3)
if __name__ == '__main__':

    """
    python3.7之后
    此时的函数是异步协程对象
    g = fun()
    运行协程对象方法如下
    asyncio.run(g)
    py3.7
    f1 = fun1()
    f2 = fun2()
    f3 = fun3()
    tasks = [f1, f2, f3]
    asyncio.run(asynico.wait(tasks))
    """

    # py3.6之前
    asyncio.get_event_loop().run_until_complete(fun())

    """
    await 放在协程对象前面
    """
    t1 = time.time()
    asyncio.get_event_loop().run_until_complete(m())
    t2 = time.time()
    print(t2 - t1)

py3.6版本实现方式和3.7之后的不一样

# py3.6
# requests.get() -》 异步aiohttp
# pip install aiohttp

import aiohttp
import asyncio
urls = [
    "http://kr.shanghai-jiuxin.com/file/bizhi/20220928/z2m1usr0hmz.jpg",
    "http://kr.shanghai-jiuxin.com/file/bizhi/20220928/mqrztqlvan3.jpg",
    "http://kr.shanghai-jiuxin.com/file/bizhi/20220928/htjizl5epz5.jpg"
]

async def download(url):
    name = url.rsplit("/", 1)[1]
    # 从右边切, with封装了close
    async with aiohttp.ClientSession() as Session:
        async with Session.get(url) as resp:
            """
                resp.content.read()
                resp.json()
                resp.text() => requests,resp.text 
            """
            with open("../images/"+name, mode="wb") as f:
                f.write(await resp.content.read())
    print("搞定")

async def main():
    tasks = []
    for url in urls:
        tasks.append(asyncio.ensure_future(download(url)))
    await asyncio.gather(*tasks)

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值