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使用代理抓取网站图片(多线程)
Mar 14 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
python实现爬取图书封面
Jul 05 Python
python矩阵/字典实现最短路径算法
Jan 17 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
Python3字符串encode与decode的讲解
Apr 02 Python
Python读取实时数据流示例
Dec 02 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
浅谈python锁与死锁问题
Aug 14 Python
OpenCV-Python实现轮廓拟合
Jun 08 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
Javascript缓存API
2016/06/14 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
机器学习10大经典算法详解
2017/12/07 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
关于人生的感言
2014/01/17 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
婚礼司仪主持词
2014/03/14 职场文书
公司经理任命书
2014/06/05 职场文书
询价采购方案
2014/06/09 职场文书
实习介绍信模板
2015/01/30 职场文书
环卫工作个人总结
2015/03/04 职场文书
开网店计划分析
2019/07/30 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript