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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
介绍Python中内置的itertools模块
Apr 29 Python
python编写爬虫小程序
May 14 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 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
十天学会php之第八天
2006/10/09 PHP
用文本文件制作留言板提示(下)
2006/10/09 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python实现海螺图片的方法示例
2019/05/12 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
tornado+celery的简单使用详解
2019/12/21 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
大学总结自我鉴定
2014/01/18 职场文书
科研课题实施方案
2014/03/18 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
主持人开幕词
2015/01/29 职场文书
经理岗位职责
2015/02/02 职场文书
门店店长岗位职责
2015/04/14 职场文书