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实现文件路径和url相互转换的方法
Jul 06 Python
在Python的Django框架中编写编译函数
Jul 20 Python
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
Python实现感知机(PLA)算法
Dec 20 Python
postman模拟访问具有Session的post请求方法
Jul 15 Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
浅析Python迭代器的高级用法
Jul 16 Python
Python识别验证码的实现示例
Sep 30 Python
Python实现LR1文法的完整实例代码
Oct 25 Python
python实现求纯色彩图像的边框
Apr 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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP连接access数据库
2008/03/27 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
解析isset与is_null的区别
2013/08/09 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
理解javascript闭包
2015/12/15 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
python threading模块操作多线程介绍
2015/04/08 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
django框架auth模块用法实例详解
2019/12/10 Python
python类共享变量操作
2020/09/03 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
班级聚会策划书
2014/01/16 职场文书
自主招生推荐信范文
2014/05/10 职场文书
初二学生评语大全
2014/12/26 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
Python上下文管理器Content Manager
2021/06/26 Python
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技