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 Deque 模块使用详解
Jul 04 Python
状态机的概念和在Python下使用状态机的教程
Apr 11 Python
总结Python中逻辑运算符的使用
May 13 Python
python 连接sqlite及简单操作
Jun 30 Python
Python字典及字典基本操作方法详解
Jan 30 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
python time()的实例用法
Nov 03 Python
Python Django路径配置实现过程解析
Nov 05 Python
python实现图片,视频人脸识别(dlib版)
Nov 18 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实现用户认证及管理完全源码
2007/03/11 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
jquery获取radio值实例
2014/10/16 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
javascript操作元素的常见方法小结
2019/11/13 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
Python Queue模块详解
2014/11/30 Python
Python中创建二维数组
2018/10/17 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python的sorted用法详解
2019/06/25 Python
Python Gitlab Api 使用方法
2019/08/28 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
Html5新标签解释及用法
2012/02/17 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
高级护理专业毕业生推荐信
2013/12/25 职场文书
初二物理教学反思
2014/01/29 职场文书
产品推广策划方案
2014/05/10 职场文书
2014年食堂工作总结
2014/11/20 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
煤矿安全保证书
2015/02/27 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript