一、概述

asyncio 是用来编写 并发 代码的库,使用 async/await 语法。

asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。

asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。

asyncio 提供一组 高层级 API 用于:

并发地 运行 Python 协程 并对其执行过程实现完全控制;

控制 子进程;

通过 队列 实现分布式任务;

同步 并发代码;

此外,还有一些 低层级 API 以支持 库和框架的开发者 实现:

创建和管理 事件循环,以提供异步 API 用于 网络化, 运行 子进程,处理 OS 信号 等等;

使用 transports 实现高效率协议;

通过 async/await 语法 桥接 基于回调的库和代码。

关于asyncio的使用,请阅读以下2篇文章:

写的非常不错,强烈推荐!!!

二、功能演示

这里有一个需求,需要ping内网中的所有ip地址,是否都可以pnig通。

内网网段为:192.168.31.0/24

完整代码如下:

test.py

#!/usr/bin/envpython3

# coding: utf-8importtimeimport subprocess

import asyncio

import re

async def ping_call(num):

# 当前时间

current_time= time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

ip= "192.168.31.%s" %num

# 超时时间为1秒,ping1次

cmd= 'ping -c 1 -w 1 -W 1 %s' %ip

print(cmd)

# 执行命令

proc= await asyncio.create_subprocess_exec('ping', '-c', '1','-w','1','-W','1', ip,

stdout=asyncio.subprocess.PIPE)

# print("proc",proc,type(proc))

result=await proc.stdout.read()

# 通过正则匹配是否有100%关键字

regex= re.findall('100% packet loss', result.decode('utf-8'))

# 长度为0时,表示没有出现100%packet lossif len(regex) == 0:

return current_time,ip,Trueelse:

return current_time,ip,False

async def main(): # 调用方

tasks=[]for i in range(1, 256):

# 把所有任务添加到task中

tasks.append(ping_call(i))

# 子生成器done, pending = await asyncio.wait(tasks)

# done和pending都是一个任务,所以返回结果需要逐个调用result()for r in done:

# print(r.result())

# 判断布尔值if r.result()[2]:

# 颜色代码

color_code= 32

else:

color_code= 31

info = "\033[1;{};1m{}\033[0m".format(color_code, r.result())

print(info)if __name__ == '__main__':

start= time.time()

# 创建一个事件循环对象loop

loop=asyncio.get_event_loop()

try:

# 完成事件循环,直到最后一个任务结束

loop.run_until_complete(main())

finally:

# 结束事件循环

loop.close()

print('所有IO任务总耗时%.5f秒' % float(time.time() - start))

View Code

执行输出:

...ping -c 1 -w 1 -W 1 192.168.31.11...

('2020-04-20 18:18:21', '192.168.31.138', False)

('2020-04-20 18:18:21', '192.168.31.230', True)

('2020-04-20 18:18:21', '192.168.31.1', True)

('2020-04-20 18:18:20', '192.168.31.170', False)

...

('2020-04-20 18:18:20', '192.168.31.200', False)

所有IO任务总耗时1.93505秒

可以发现,花费时间为1.9秒。速度特别快!

如果同步执行,可能需要500多秒。

注意:subprocess模块,是调用asyncio.create_subprocess_exec,它返回一个asyncio生成器对象。

如果直接调用python自带的subprocess模块,是无法实现异步的。

本文参考链接:

python3 asyncio github_python3 asyncio相关推荐

  1. Python3 中的 asyncio async await 概念(实例)(ValueError: too many file descriptors in select())

    代码实例 import timedef demo4():"""这是最终我们想要的实现."""import asyncio # 引入 asyn ...

  2. python asyncio.sleep_Python asyncio 模块

    Python 3.4 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLo ...

  3. python asyncio future_Python asyncio.isfuture方法代码示例

    本文整理汇总了Python中asyncio.isfuture方法的典型用法代码示例.如果您正苦于以下问题:Python asyncio.isfuture方法的具体用法?Python asyncio.i ...

  4. python asyncio future_Python asyncio.ensure_future方法代碼示例

    本文整理匯總了Python中asyncio.ensure_future方法的典型用法代碼示例.如果您正苦於以下問題:Python asyncio.ensure_future方法的具體用法?Python ...

  5. python3 异步错误 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop

    错误现象 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop asyncio.Semaphore ...

  6. python asyncio教程_在Python3中使用asyncio库进行快速数据抓取的教程

    web数据抓取是一个经常在python的讨论中出现的主题.有很多方法可以用来进行web数据抓取,然而其中好像并没有一个最好的办法.有一些如scrapy这样十分成熟的框架,更多的则是像mechanize ...

  7. python3 协程asyncio 调用步骤、阻塞和await、task任务、future对象 partial

    首先介绍一下 偏函数 如果需要减少某个函数的参数个数,你可以使用 functools.partial() [作用一]:partial() 函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参 ...

  8. python3中aiohttp+asyncio 高效率爬取图片例子,本地保存

    import asyncio import aiohttp import time import random import os from lxml import etreepath='F:\\wu ...

  9. python asyncio future_Python asyncio:yield from未用于future?

    我正在尝试使用asyncio进行异步客户机/服务器设置. 出于某种原因,我在运行客户机时得到AssertionError: yield from wasn't used with future. 搜索 ...

最新文章

  1. 函数 —— fork()分叉函数
  2. Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异
  3. ADOQuery的locktype属性
  4. 总结嵌入式C语言知识点
  5. html转pdf乱码问题,java html 转 pdf 中文乱码
  6. python简单爬虫获取行政边界点坐标
  7. Python PDF转图片 Word
  8. Visio自制直角箭头
  9. 华为鸿蒙内涵,“鸿蒙”两个字有何真意,还得让古人来解读
  10. 计算机网络:第四章网络层课后习题及答案(精细版)
  11. 荣耀X10 Max配置怎么样?今天来聊一聊
  12. bzoj 3620: 似乎在梦中见过的样子
  13. UnoR3+MG90S舵机+红外遥控制作自动控制灯【Arduino】
  14. MATLAB | 19a到22a之间都更新了哪些绘图新特性?
  15. vue防抖注册全局_vue防抖节流函数---组件封装,防止按钮多次点击
  16. buuctf-misc-[SWPU2019]神奇的二维码1
  17. C语言与电子信息工程的关系,信息工程和电子信息工程区别
  18. 《两日算法系列》之第五篇:SVM
  19. 安装MatlabR2018a后遇到“Licence Manager Error -8”的解决方案
  20. 新手小白如何入坑黑客技术(黑客入门教程)

热门文章

  1. java semaphore(0)_Semaphore
  2. 实体鉴别GB/T 15843研究(三)——GB/T 15843.3 采用数字签名技术
  3. 【转】三星三款主流处理器s3c2440\s3c6410\s5pv210对比分析
  4. 曙光服务器装系统配置,曙光作业管理-调度系统安装配置手册
  5. easyexcel一个模板动态多个sheet填充
  6. python解决汉字批量转拼音问题
  7. 长沙理工大学计算机英语试卷,长沙理工大学考试试卷(计算机网络).doc
  8. Revenue Recognition-收入确认
  9. iOS APP启动图片适配iPhoneX
  10. 区块链产业园拔地而起,多方面亟待问题解决?