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中使用asyncio 封装文件读写
Sep 11 Python
python批量替换页眉页脚实例代码
Jan 22 Python
Window10+Python3.5安装opencv的教程推荐
Apr 02 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
基于python全局设置id 自动化测试元素定位过程解析
Sep 04 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
Django框架反向解析操作详解
Nov 28 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 Python
Python常遇到的错误和异常
Nov 02 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
PHP实现简单登录界面
2019/10/23 PHP
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
Python实现保证只能运行一个脚本实例
2015/06/24 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Python下载的11种姿势(小结)
2020/11/18 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
美国在线购物频道:Shop LC
2019/04/21 全球购物
优秀学生干部推荐材料
2014/02/03 职场文书
工程专业应届生求职信
2014/02/19 职场文书
优秀毕业生推荐信范文
2014/03/07 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
银行授权委托书格式
2014/10/10 职场文书
高中社区服务活动报告
2015/02/05 职场文书
党员反邪教心得体会
2016/01/15 职场文书
高中地理教学反思
2016/02/19 职场文书
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python