Python async模块使用方法杂谈
作者:右眸Remnant 发布时间:2023-12-12 14:46:36
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
协程:协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行
Python对协程的支持是通过generator实现的。
在generator中,我们不但可以通过for循环来迭代,还可以不断调用next()函数获取由yield语句返回的下一个值。 但是Python的yield不但可以返回一个值,它还可以接收调用者发出的参数。
一、什么是 generator(生成器)
在Python中,这种一边循环一边计算的机制,称为生成器:generator。通过给定一个算法然后在调用的过程中计算真实值。
当需要从generator中获取值的时候可以使用next(),但是一般使用for循环进行获取。
generator的实现方式
生成器,使用()表示
如:[1, 2, 3, 4, 5],生成器方法:
data = [1, 2, 3, 4, 5]
(x * x for x in len(data))
函数定义在一些逻辑复杂的场景下,使用第一种方法不太合适,因此存在类型函数定义的方式,如:
def num(x):
while (x < 10):
print(x * x)
x += 1
g = num(1)
for item in g:
print(item)
当函数中出现yield的时候,此时就成为generator
def num(x):
while (x < 10):
yield x * x # 返回结果,下次从这个地方继续?
x += 1
g = num(1) # 返回的是generator对象
for item in g:
print(item)
变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
二、使用asyncio 实现异步io
异步io通过事件循环和协程函数实现
事件循环即不断监察内部的任务,如果存在则执行;任务分为可执行和正在执行;由事件循环决定处理任务,如果任务列表为空,事件终止。
import asyncio
# 生成或获取事件循环对象loop;类比Java的Netty,我理解为开启一个selector
loop = asyncio.get_event_loop()
# 将协程函数(任务)提交到事件循环的任务列表中,协程函数执行完成之后终止。
# run_until_complete 会检查协程函数的运行状态,并执行协程函数
loop.run_until_complete( func() )
test demo
import asyncio
import time
async def test():
print("io等待")
await asyncio.sleep(1)
return 'hello'
async def hello():
print("Hello world")
r = await test()
print("hello again")
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
协程函数:由 async def 修饰的函数;相比于普通的def, 如 def func(),可以直接接收到函数返回的值;但是对于协程函数返回的是一个协程对象。
想要运行协程函数,需要将这个对象交给事件循环进行处理。
# 测试协程
import asyncio
import time, datetime
# 异步函数不同于普通函数,调用普通函数会得到返回值
# 而调用异步函数会得到一个协程对象。我们需要将协程对象放到一个事件循环中才能达到与其他协程对象协作的效果
# 因为事件循环会负责处理子程 序切换的操作。
async def Print():
return "hello"
loop = asyncio.get_event_loop()
loop.run_until_complete(Print)
await:
用法:reponse = await + 可等待对象
可等待对象: 协程对象, Future, Task对象 可理解为IO等待
response : 等待的结果
await 遇到IO操作会挂起当前协程(任务),当前协程挂起时,事件循环可以去执行其他协程(任务)
注意:可等待对象若是协程对象则变成串行,若是Task对象则并发运行
Task对象,可以在事件循环列表中添加多个任务。可以通过**asyncio.create_task(协程对象)**的方式创建Task对象
import asyncio
import time, datetime
async def display(num):
pass
tasks = []
for num in range(10):
tasks.append(display(num)) # 生成任务列表
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
asnyc和await是新语法,旧版本为:@asyncio.coroutine 和 yield from
三、aiohttp
asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。
aiohttp则是基于asyncio实现的HTTP框架。
可以类似requests发送请求 get请求
可以通过params参数来指定要传递的参数
async def fetch(session):
async with session.get("http://localhost:10056/test/") as response:
data = json.loads(await response.text())
print(data["data"])
post请求
异步的执行两个任务
在网络请求中,一个请求就是一个会话,然后aiohttp使用的是ClientSession来管理会话
使用session.method发送请求
对于响应信息response, 通过status来获取响应状态码,text()来获取到响应内容;可以在text()指定编码格式。 在response.text()前面添加await表示等待响应结果
async def init(num):
async with aiohttp.ClientSession() as session:
if num == 1:
time.sleep(5)
print("session begin", num)
async with session.post("http://localhost:10056/hello/", data=json.dumps({"data": "hello"})) as response:
print("client begin", num)
data = json.loads(await response.text())
print(data["data"])
print("session end", num)
print("other")
if __name__ == '__main__':
loop = asyncio.get_event_loop()
tasks = [init(1), init(2)]
loop.run_until_complete(asyncio.wait(tasks))
来源:https://blog.csdn.net/qq_45888932/article/details/125424397


猜你喜欢
- SQL Server 2005默认是不允许远程连接的,要想通过远程连接实现MSSQL,数据库备份,需要做如下设置:步骤/方法1.打开SQL
- 前言最近写的项目中用到了JWT鉴权,因此做个记录原先的jwt-go仓库已经不再维护,迁移到了github.com/golang-jwt/jw
- 处理上传的文件: f1 = request.FILES['pic'] fname = '%s/%s' % (
- INSTR的第三个参数为1时,实现的是indexOf功能。 INSTR的第三个参数为-1时,实现的是lastIndexOf功能。 例如: I
- 前言electron+vuecli3 实现设置打印机,静默打印小票功能网上相关的资料比较少,这里给大家分享一下,希望大家可以少踩一些坑git
- 1、linux系统一般自带perl可运行程序在:/usr/bin/perl2、perl测试程序#!/usr/bin/perl -wuse w
- 本文实例讲述了Django发送html邮件的方法。分享给大家供大家参考。具体如下:在Django中,发送邮件非常的方便,一直没有时间,今天来
- 问题在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too m
- pycharm简介PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语
- 本文实例讲述了python创建临时文件夹的方法。分享给大家供大家参考。具体实现方法如下:import tempfile, os tempfd
- 在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换
- 不同的色彩空间中对图片的色彩体现有很大不同#色彩空间的相互转换:最常见的是HSV与RGB,YUV与RGB的相互转换#常见色彩空间有:#RGB
- 本文为大家分享了MySQL 8.0.29 安装配置方法图文教程,供大家参考,具体内容如下一、下载MySQL1、进入MySQL官网MySQL并
- 本文利用Python3启动简单的HTTP服务器,以实现在同一网络中共享本地文件。启动HTTP服务器打开终端,转入目标文件所在文件夹,键入以下
- 用Dreamweaver制作网页时,如果插入的图片、GIF动画、声音、视频或链接的网页是用中文命名的,在用IE浏览器浏览时可能显示不出来。以
- 1、PHP中的抽象类PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么
- 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1说明:拷贝
- 废话不多说,直接给大家上干货了,写的不好欢迎提出意见。具体代码如下所示:function hiddenPass(event){ var pa
- 前言:本文介绍如何构建简单线性回归模型及计算其准确率,最后介绍如何持久化模型。线性回归模型线性回归表示发现函数使用线性组合表示输入变量。简单
- 首先我们来看个示例:<form name="buyerForm" method="post"