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 初始化多维数组代码
Sep 06 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
Python读写ini文件的方法
May 28 Python
浅谈Python中函数的参数传递
Jun 21 Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
基于Python爬取股票数据过程详解
Oct 21 Python
使用python实现学生信息管理系统
Feb 25 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 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
YII中assets的使用示例
2014/07/31 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
python matlab库简单用法讲解
2020/12/31 Python
美国知名的百货清仓店:Neiman Marcus Last Call
2016/08/03 全球购物
大型活动策划方案
2014/01/12 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
保护环境倡议书500字
2014/05/19 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
班主任寄语2015
2015/02/26 职场文书
房产证明范本
2015/06/19 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android