入门, 如何发送你的第一段异步请求

入门, 如何发送你的第一段异步请求
Page content

异步编程是一种并行编程,其中允许一个工作单元与主应用程序线程分开运行。而其效率往往比同步代码高出数十倍。今天我就拿前段时间给朋友写的扫描器作为一个案例,带大家进入异步的世界。

sync VS async

首先我们通过一张图来简单得对比下两者速度上的区别及工作方式

可以看到sync是一个接一个的运行;而async则是几乎同时开始,结束于最慢的那一个任务。结果很明显,异步效率高得惊人!那么两者的代码又该怎么编写呢,我们继续往下看。

我们现在预设一个长度为20个url的任务,并分别编写代码运行。


tasks = ['http://www.baidu.com']*20

同步代码

首先我们使用requests编写同步请求,并用一个for循环来完成对全部任务的请求。

import requests

for url in tasks:
    requests.get(url)

异步代码

asyncio 是用来编写并发代码的库,使用 async/await 语法 ; 而 aiohttp 则是一个用于 asyncio 的异步请求及服务库

import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        await session.get(url)

async def run_all():
    await asyncio.gather(*[fetch(url) for url in tasks])

asyncio.run(run_all())