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类的基础入门知识
Nov 24 Python
Python中用Spark模块的使用教程
Apr 13 Python
Python删除windows垃圾文件的方法
Jul 14 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
Django框架视图介绍与使用详解
Jul 18 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
python3.7添加dlib模块的方法
Jul 01 Python
深入浅析Python代码规范性检测
Jul 31 Python
python实现过滤敏感词
May 08 Python
Python 如何解决稀疏矩阵运算
May 26 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的加密方式及原理
2012/06/14 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
vue中axios的二次封装实例讲解
2019/10/14 Javascript
vue实现购物车案例
2020/05/30 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
react中hook介绍以及使用教程
2020/12/11 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python单例模式的两种实现方法
2017/08/14 Python
详解python分布式进程
2018/10/08 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
python datetime处理时间小结
2020/04/16 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
大学生创业计划书
2019/06/24 职场文书