example_of_asyncio.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import asyncio
  2. async def fetch(host):
  3. """从指定的站点抓取信息(协程函数)"""
  4. print(f'Start fetching {host}\n')
  5. # 跟服务器建立连接
  6. reader, writer = await asyncio.open_connection(host, 80)
  7. # 构造请求行和请求头
  8. writer.write(b'GET / HTTP/1.1\r\n')
  9. writer.write(f'Host: {host}\r\n'.encode())
  10. writer.write(b'\r\n')
  11. # 清空缓存区(发送请求)
  12. await writer.drain()
  13. # 接收服务器的响应(读取响应行和响应头)
  14. line = await reader.readline()
  15. while line != b'\r\n':
  16. print(line.decode().rstrip())
  17. line = await reader.readline()
  18. print('\n')
  19. writer.close()
  20. def main():
  21. """主函数"""
  22. urls = ('www.sohu.com', 'www.douban.com', 'www.163.com')
  23. # 获取系统默认的事件循环
  24. loop = asyncio.get_event_loop()
  25. # 用生成式语法构造一个包含多个协程对象的列表
  26. tasks = [fetch(url) for url in urls]
  27. # 通过asyncio模块的wait函数将协程列表包装成Task(Future子类)并等待其执行完成
  28. # 通过事件循环的run_until_complete方法运行任务直到Future完成并返回它的结果
  29. futures = asyncio.wait(tasks)
  30. print(futures, type(futures))
  31. loop.run_until_complete(futures)
  32. loop.close()
  33. if __name__ == '__main__':
  34. main()