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 相关文章推荐
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
python得到windows自启动列表的方法
Oct 14 Python
对python调用RPC接口的实例详解
Jan 03 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
python手机号前7位归属地爬虫代码实例
Mar 31 Python
Python实现Kerberos用户的增删改查操作
Dec 14 Python
pytorch实现线性回归以及多元回归
Apr 11 Python
详解NumPy中的线性关系与数据修剪压缩
May 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
基于initPHP的框架介绍
2013/04/18 PHP
php四种定界符详解
2017/02/16 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
跟老齐学Python之编写类之三子类
2014/10/11 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
python框架django基础指南
2016/09/08 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
python多线程同步之文件读写控制
2021/02/25 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
python如何使用腾讯云发送短信
2020/09/17 Python
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
职工运动会邀请函
2014/02/02 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
离婚协议书的范本
2015/01/27 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android