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使用matplotlib绘制动画的方法
May 20 Python
python实现中文转换url编码的方法
Jun 14 Python
深入学习Python中的装饰器使用
Jun 20 Python
python通过百度地图API获取某地址的经纬度详解
Jan 28 Python
对python append 与浅拷贝的实例讲解
May 04 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
基于pytorch的保存和加载模型参数的方法
Aug 17 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
Mar 06 Python
python如何构建mock接口服务
Jan 28 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不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
许愿墙中用到的函数
2006/10/07 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
python和C语言混合编程实例
2014/06/04 Python
Python进程间通信Queue实例解析
2018/01/25 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
解决python 上传图片限制格式问题
2019/10/30 Python
耐克亚太地区:Nike APAC
2019/12/07 全球购物
linux面试相关问题
2012/08/11 面试题
成品仓管员工作职责
2013/12/29 职场文书
大学生入党思想汇报
2014/01/14 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
根叔历年演讲稿
2014/05/20 职场文书
本科毕业生自荐信
2014/05/26 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
初二学生评语大全
2014/12/26 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
python - timeit 时间模块
2021/04/06 Python
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript