调用asyncio.to_thread后上下文依然一致吗

news/2024/7/7 15:41:06 标签: python, asyncio

使用Python的asyncio时,可以把一个同步的函数放到线程池中执行从而避免这个函数阻塞asyncio自身的事件循环。比如可以把requests库的请求放进去

python">async def to_thread_do_request(url):
    return await asyncio.to_thread(requests.get, url)

这个to_thread_do_request方法就不会造成asyncio的阻塞,反而下面这样直接调用一个下面这样把requests.get简单包在一个async函数里则会造成的协程的阻塞

python">async def do_request(url):
    return requests.get(url)

不过在使用asyncio.to_thread函数时,我们需要注意一点,即asyncio的上下文,也就是通过contextvars来保存的内容通过asyncio.to_thread来执行时与调用者否是一致的?

这个可以大致看一下asyncio.to_thread的实现,我们会发现,对于context来说,这个to_thread会先调用contextvars.copy_context方法把当前的context整体复制到ctx变量中,然后再通过ctx.run来执行其实际任务。这样通过asyncio.to_thread来执行的函数,与调用方的context是一致的,可以放心的把一些需要获取contextvars的工作放在里面跑。


http://www.niftyadmin.cn/n/5535525.html

相关文章

Sourcecodester Fantastic Blog CMS v1.0 SQL 注入漏洞(CVE-2022-28512)

前言 CVE-2022-28512 是一个存在于 Sourcecodester Fantastic Blog CMS v1.0 中的 SQL 注入漏洞。攻击者可以通过 "/fantasticblog/single.php" 中的 id 参数注入恶意 SQL 查询,从而获得对数据库的未经授权的访问和控制。 漏洞详细信息 漏洞描述: 该漏…

自然语言处理与Transformer模型:革新语言理解的新时代

引言 自然语言处理(NLP)是人工智能和计算机科学的一个重要分支,旨在使计算机能够理解、生成和处理人类语言。随着互联网和数字化信息的爆炸性增长,NLP在许多领域中的应用变得越来越重要,包括: 搜索引擎&am…

PHP框架Symfony详解

Symfony 是一个用PHP语言编写的开放源代码的Web应用框架,旨在加速Web应用程序的开发过程,提高代码的可维护性和可扩展性。以下是对Symfony框架的详细解析: 一、框架概述 1. 起源与开发者 Symfony由SensioLabs(现为Symfony公司&…

HarmonyOS ArkUi ArkWeb加载不出网页问题踩坑

使用 使用还是比较简单的,直接贴代码了 别忘了配置网络权限 Entry Component struct WebPage {State isAttachController: boolean falseState url: string State title: string Prop controller: web_webview.WebviewController new web_webview.WebviewCont…

小龙虾优化24种机器学习多输入单输出回归|时序预测模型

小龙虾优化24种机器学习多输入单输出回归|时序预测模型 文章目录 小龙虾优化24种机器学习多输入单输出回归|时序预测模型前言一、小龙虾优化基本原理二、优化机器学习模型1.COA-CNN-BiGRU-Attention回归模型2.基于小龙虾优化支持向量机的数据回归预测Matlab程序COA-SVM 多特征输…

设计模式-代理模式和装饰者模式

二者都是结构型的设计模式. 1.代理模式 1.1定义 为其他对象提供一种代理以控制对这个对象的访问. 代理从code实现方面分为静态代理和动态代理两种; 从适用范围来看,分为远程代理,虚拟代理,保护代理,智能引用几种. 远程代理:为某个对象在不同的内存地址空间提供…

Navicat 外网连接 mysql (1、通过SSH方式内网访问 2、对外开放3306端口)

1、通过SSH方式内网访问 直接常规方式使用IP、账号密码连接,失败 SSH方式: 常规 选项卡中:localhost录入数据库账号密码 SSH 选项卡中:勾选使用SSH,输入服务器IP、账号、密码 如果出现该错误,可能是服务器…

ClickHouse-Keeper安装使用

1.rpm 安装 clickhouse-keeper rpm -ivh clickhouse-keeper-23.8.11.28.x86_64.rpm 2.修改keeper的配置文件 vi /etc/clickhouse-keeper/keeper_config.xml修改部分参数 1.可修改日志等存储路径 2.增加监听配置 <listen_host>0.0.0.0</listen_host> 3.server_id…