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算法应用实战之栈详解
Feb 04 Python
python 删除非空文件夹的实例
Apr 26 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
python opencv实现运动检测
Jul 10 Python
django 环境变量配置过程详解
Aug 06 Python
python 爬取学信网登录页面的例子
Aug 13 Python
Python二次规划和线性规划使用实例
Dec 09 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 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
深入掌握include_once与require_once的区别
2013/06/17 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
jquery 插件学习(二)
2012/08/06 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
Python selenium 三种等待方式解读
2016/09/15 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python程序封装为win32服务的方法
2021/03/07 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
教师应聘个人求职信
2013/12/10 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
2014年清明节寄语
2014/04/03 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
《废话连篇——致新手》——chinapizza
2022/04/05 无线电