Python 异步协程函数原理及实例详解


Posted in Python onNovember 13, 2019

这篇文章主要介绍了Python 异步协程函数原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、 asyncio

1.python3.4开始引入标准库之中,内置对异步io的支持

2.asyncio本身是一个消息循环

3.步骤:

(1)创建消息循环

(2)把协程导入

(3)关闭

4.举例:

import threading
# 引入异步io包
import asyncio
# 使用协程
@ asyncio.coroutine
def hello():
	print("Hello World!(%s)" % threading.current_thread())
print("Start......(%s)" % threading.current_thread())
yield from asyncio.sleep(5)
print("Done.....(%s)" % threading.current_thread())
print("Hello again!(%s)" % threading.current_thread())
# 启动消息循环
loop = asyncio.get_event_loop()
# 定义任务
tasks = [hello(), hello()]
# asyncio使用wait等待task执行完毕
loop.run_until_complete(asyncio.wait(
	tasks))
# 关闭消息循环
loop.close()

Python 异步协程函数原理及实例详解

二、asyncio and await

1.为了更好的表示异步io

2.python3.5引入

3.让协程代码更加简洁

4.使用上,可以简单的进行替换

(1)用async来替换@asyncio,coroutine

(2)用await来替换yield from

按照上面这个语法可以来改写前面的例子,运行结果是完全一致的

三、aiohttp

1.asyncio实现单线程的并发io,在客户端用处不大

2.在服务端可以asyncio+coroutine配合,因为http是io操作

3.asyncio实现了tcp,udp,ssl等协议

4.aiohttp是基于asyncio实现的http框架

5.例子:

import asyncio
from aiohttp
import web
​
async def index(request):
	await asyncio.sleep(0.5)
return web.Response(body = b "<h1>Index</h1>")
​
async def hello(request):
	await asyncio.sleep(0.5)
text = "<h1>hello,%s!</h1>" % request.match_info[
	"name"]
return web.Response(body = text.encode(
	"utf-8"))
​
async def init(loop):
	app = web.Application(loop = loop)
app.router.add_route("GET", "/", index)
app.router.add_route("GET",
	"/hellp/{name}", hello)
srv = await loop.create_server(app.make_handler(),
	"127.0.0.1", 8000)
print(
	"Server started at http://127.0.0.1:8000..."
)
return srv
​
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()

四、current,futures

1. python3新增的库

2.类似其它语言的线程池的概念

3.利用multiprocessing实现真正的并行计算(当然要求我们的CPU是多核的)

4.核心原理:以子进程的形式,实现多个python解释器

从而令python程序,可以利用多核CPU来提升执行速度。由于子进程于主解释器相分离,所以他们的全局解释器锁也是相互独立的,每个子进程都能完整的使用一个CPU内核

5.concurrent.futures.Executor

(1)ThreadPoolExecutor

(2)ProcessPoolExecutor

(3)执行的时候需要自行选择

(4)submit(fn,args,kwargs)

fn:异步执行的函数

args,kwargs参数

import time
from concurrent.futures
import ThreadPoolExecutor
​
def return_future(msg):
	time.sleep(3)
return msg
​
# 创建一个线程池
pool = ThreadPoolExecutor(max_workers =
	2)# 参数是2, 代表里面有两个线程干活
# 往线程池里面加入两个task
f1 = pool.submit(return_future, "hello")
f2 = pool.submit(return_future, "world")
time.sleep(1)
# 等待执行完毕
print(f1.done())
time.sleep(3)
print(f2.done())
# 结果
print(f1.result())
print(f2.result())

Python 异步协程函数原理及实例详解

源码

d28_1_asynchronization_examples.py

https://github.com/ruigege66/Python_learning/blob/master/d28_1_asynchronization_examples.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
Python实现KNN邻近算法
Jan 28 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python对日志进行处理的实例代码
Oct 06 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
浅析python实现动态规划背包问题
Dec 31 Python
python文字转语音实现过程解析
Nov 12 #Python
python文字转语音的实例代码分析
Nov 12 #Python
Python上下文管理器全实例详解
Nov 12 #Python
python3-flask-3将信息写入日志的实操方法
Nov 12 #Python
Python API自动化框架总结
Nov 12 #Python
python的scipy实现插值的示例代码
Nov 12 #Python
python对验证码降噪的实现示例代码
Nov 12 #Python
You might like
php二维数组转成字符串示例
2014/02/17 PHP
php中final关键字用法分析
2016/12/07 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
Javascript倒计时代码
2010/08/12 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
详解C++编程中一元运算符的重载
2016/01/19 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
机电工程学生自荐信范文
2013/12/07 职场文书
单位领导证婚词
2014/01/14 职场文书
探亲邀请信范文
2014/01/30 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
期末评语大全
2014/05/04 职场文书
幼儿教师求职信
2014/05/24 职场文书
村党支部书记承诺书
2014/05/29 职场文书
电影地道战观后感
2015/06/04 职场文书
新手入门Mysql--概念
2021/06/18 MySQL
java版 简单三子棋游戏
2022/05/04 Java/Android
python热力图实现的完整实例
2022/06/25 Python