python中asyncio的使用实例

Python 3通过asyncio模块以及awaitasync关键字提供了对异步I/O的支持。

步编程通常通过多任务协作处理的方式来实现,由于执行时间和顺序的不确定,因此需要通过钩子函数(回调函数)或者Future对象来获取任务执行的结果。

import asyncio

async def fetch(host):
    # 从指定站点抓取信息
    print(f'开始抓取{host}')
    # 和服务器建立连接
    reader, writer = await asyncio.open_connection(host, 80)
    # 构建请求行和请求头
    writer.write(b'GET / HTTP/1.1\r\n')
    writer.write(f'Host:{host}\r\n'.encode())
    writer.write(b'\r\n')
    # 清空缓存区
    await writer.drain()
    # 接收服务器的响应
    line = await reader.readline()
    while line != b'\r\n':
        print(line.decode().rsplit())
        line = await reader.readline()
    print('\n')
    writer.close()

def main():
    urls = ('www.baidu.com', 'www.csdn.net', 'www.163.com')
    # 获取系统默认事件循环
    loop = asyncio.get_event_loop()
    # 生成式语法,构造一个包含多个协议对象的列表
    tasks = [fetch(url) for url in urls]
    # wait: 将协程列表包装成Task(Future)并等待执行完成
    # run_until_complete: 运行任务,直到Future执行完成并返回结果
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()

if __name__ == '__main__':
    main()

执行结果:

开始抓取www.163.com
开始抓取www.baidu.com
开始抓取www.csdn.net
['HTTP/1.1', '200', 'OK']
['Date:', 'Tue,', '31', 'Mar', '2020', '15:08:46', 'GMT']
['Content-Type:', 'text/html;', 'charset=GBK']
['Transfer-Encoding:', 'chunked']
['Connection:', 'keep-alive']
['Expires:', 'Tue,', '31', 'Mar', '2020', '15:09:59', 'GMT']
['Server:', 'nginx']
['Cache-Control:', 'no-cache,no-store,private']
['Age:', '7']
['Vary:', 'Accept-Encoding']
['X-Ser:', 'BC80_dx-lt-yd-jiangsu-taizhou-4-cache-4,', 'BC84_dx-lt-yd-jiangsu-taizhou-4-cache-4,', 'BC233_ck-hubei-wuhan-2-cache-2,', 'BC196_ck-hubei-wuhan-2-cache-1']
['cdn-user-ip:', '49.211.105.136']
['cdn-ip:', '124.203.225.195']
['X-Cache-Remote:', 'HIT']
['cdn-source:', 'baishan']


['HTTP/1.1', '200', 'OK']
['Accept-Ranges:', 'bytes']
['Cache-Control:', 'no-cache']
['Connection:', 'keep-alive']
['Content-Length:', '14615']
['Content-Type:', 'text/html']
['Date:', 'Tue,', '31', 'Mar', '2020', '15:08:46', 'GMT']
['P3p:', 'CP="', 'OTI', 'DSP', 'COR', 'IVA', 'OUR', 'IND', 'COM', '"']
['P3p:', 'CP="', 'OTI', 'DSP', 'COR', 'IVA', 'OUR', 'IND', 'COM', '"']
['Pragma:', 'no-cache']
['Server:', 'BWS/1.1']
['Set-Cookie:', 'BAIDUID=9086941EE74E01736F33F9B8CF3844A2:FG=1;', 'expires=Thu,', '31-Dec-37', '23:55:55', 'GMT;', 'max-age=2147483647;', 'path=/;', 'domain=.baidu.com']
['Set-Cookie:', 'BIDUPSID=9086941EE74E01736F33F9B8CF3844A2;', 'expires=Thu,', '31-Dec-37', '23:55:55', 'GMT;', 'max-age=2147483647;', 'path=/;', 'domain=.baidu.com']
['Set-Cookie:', 'PSTM=1585667326;', 'expires=Thu,', '31-Dec-37', '23:55:55', 'GMT;', 'max-age=2147483647;', 'path=/;', 'domain=.baidu.com']
['Set-Cookie:', 'BAIDUID=9086941EE74E01739D5D416533CDA255:FG=1;', 'max-age=31536000;', 'expires=Wed,', '31-Mar-21', '15:08:46', 'GMT;', 'domain=.baidu.com;', 'path=/;', 'version=1;', 'comment=bd']
['Traceid:', '1585667326274850689010390091619431081419']
['Vary:', 'Accept-Encoding']
['X-Ua-Compatible:', 'IE=Edge,chrome=1']


['HTTP/1.1', '301', 'Moved', 'Permanently']
['Server:', 'openresty']
['Date:', 'Tue,', '31', 'Mar', '2020', '15:08:46', 'GMT']
['Content-Type:', 'text/html']
['Content-Length:', '182']
['Connection:', 'keep-alive']
['Keep-Alive:', 'timeout=20']
['Location:', 'https://www.csdn.net/']

Process finished with exit code 0
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python asyncio (Asynchronous I/O) 是 Python 3.4 之后加入的一种异步编程方式,它提供了一整套的异步 I/O 原语(基于协程),使得编写高效的异步程序变得更加容易。 下面是一个简单的 asyncio 程序示例: ```python import asyncio async def hello(): print("Hello") await asyncio.sleep(1) print("World") loop = asyncio.get_event_loop() loop.run_until_complete(hello()) loop.close() ``` 这个程序定义了一个名为 hello 的协程,通过 async 关键字将其标记为异步函数。在协程内部,我们使用了 await asyncio.sleep(1) 来模拟一个阻塞 I/O 操作(这里是等待 1 秒钟),同时让事件循环在这段时间内处理其他任务。 最后,我们通过 asyncio.get_event_loop() 获取事件循环实例,然后通过 loop.run_until_complete(hello()) 来启动程序并执行协程。这里的 run_until_complete 方法会一直运行,直到协程执行完成。 需要注意的是,协程的执行顺序是由事件循环控制的,也就是说,协程的代码执行到 await 表达式时,事件循环会挂起当前协程,开始执行其他协程或事件处理程序,直到 await 表达式的条件满足时再继续执行当前协程。 除了上述示例的基础用法,asyncio 还提供了很多高级的功能,比如事件循环、协程调度、任务管理、网络编程、进程池等。如果你想深入学习 asyncio,可以参考官方文档:https://docs.python.org/3/library/asyncio.html。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值