问题标签 [python-contextvars]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1139 浏览

python - 如何编写一致的有状态上下文管理器?

编辑:正如Thierry Lathuille所指出的,引入的PEP567ContextVar并非旨在解决生成器问题(与撤回的PEP550不同)。不过,主要问题仍然存在。如何编写与多个线程、生成器和asyncio任务正确运行的有状态上下文管理器?


我有一个库,其中包含一些可以在不同“模式”下工作的函数,因此它们的行为可以通过本地上下文进行更改。我正在研究contextvars模块以可靠地实现这一点,因此我可以从不同的线程、异步上下文等中使用它。但是,我无法让一个简单的示例正常工作。考虑这个最小的设置:

这是一个带有生成器功能的小测试:

我得到以下输出:

在该部分:

它应该Mode 1不是Mode 2,因为这是从 打印的first,据我所知,应用上下文应该是use_mode(1)。但是,似乎use_mode(2)ofsecond被堆叠在它上面,直到生成器完成。不支持生成器contextvars吗?如果是这样,有没有办法可靠地支持有状态的上下文管理器?通过可靠,我的意思是我是否使用它应该表现一致:

  • 多线程。
  • 发电机。
  • asyncio
0 投票
4 回答
3699 浏览

python - 跨模块的 ContextVars

我对 asyncio 完全陌生ContextVars,我刚刚阅读了 3.7 中的新功能并发现ContextVars,我很难理解它的用法,我只知道它在协程中很有帮助,而不是使用thread.local应该使用ContextVars。但是官方文档和顶级谷歌搜索结果都不能帮助我真正理解它的目的。

那么凸变量是否跨模块共享?我试过了:

例子.py

然后我尝试导入 number.py

我原以为number.get()会返回 1,但显然我理解它的目的是错误的。

有人可以帮我理解这一点吗?

0 投票
3 回答
12442 浏览

python - Python 3.7.3 虚拟环境中没有名为“_contextvars”的模块

我正在开发一个Django项目,该项目需要Ubuntu 16上的Python3.7.3虚拟环境。所以我创建了一个虚拟环境并在其中安装了所有需求并对其进行了验证,激活了它。

但是,当我尝试使用它运行Django服务器runserver时,会出现以下错误。

请注意,它首先会转到我virtualenv这里的 Django 项目。

它再次在这里搜索 python 的全局位置。

有人可以让我知道为什么它会转到全球位置并抛出错误。

0 投票
0 回答
368 浏览

python - 如何在不传递上下文的情况下翻译命令。(不和谐机器人)

我正在编写一个 Discord 机器人。在那里你定义你的命令,比如

这将创建一个命令hello,该命令将发送一条消息。

现在我想为它添加翻译。在我的数据库中,我通过公会 ID 存储每个公会的语言。公会 ID 传入ctx.guild.id。我想要一个翻译功能来处理这个过程。而且我不想每次需要翻译时都传递公会ID。我已经看到了一些使用ContextVars. 但我不知道它是如何工作的。

有人对如何处理它有建议吗?IdleRPG 也集成了这一点,但非常复杂:https ://github.com/Gelbpunkt/IdleRPG/blob/v4/utils/i18n.py

实际的翻译功能似乎不是问题。最后它应该看起来像这样。

0 投票
1 回答
760 浏览

python - 为 contextvars.Context 提供一个 ContextManager

我正在尝试在我的数据库框架中管理事务(我使用 MongoDB 和 umongo 而不是 pymongo)。

要使用事务,必须在整个调用链中传递一个sessionkwarg。我想提供一个上下文管理器来隔离事务。只有调用链末端的函数需要知道该session对象。

我发现了上下文变量,我接近了一些东西,但并不完全在那里。

我想拥有的:

这是我现在想出的:

但是我没有很好的上下文管理器语法。上下文管理器的重点是“其中的所有内容都应该在该上下文中运行”。

我上面写的并不比仅仅使用一个函数更好:

我在错误的轨道上吗?

我是否滥用了上下文变量?

还有其他方法可以实现我想要做的事情吗?


基本上,我希望能够像上下文管理器一样打开上下文

我将它嵌入到Transaction上下文管理器中来管理会话内容,并且只d在用户代码中保持操作。

0 投票
0 回答
262 浏览

python - 通过标识符获取上下文变量

我正在尝试使用新的 contextvars 库(https://docs.python.org/3/library/contextvars.html)在异步上下文中跨模块提供某些值,类似于跨模块的 ContextVars,并且想知道如果有一种方法可以通过名称或标识符从给定的执行上下文中获取上下文变量,而无需直接导入上下文变量。

理想情况下,我想做以下事情:

在一个单独的模块中,它可以根据设置的语言提供 Web 请求或获取翻译:

我意识到 contextvars 库的 API 具有 ContextVar 对象和值之间的映射,而不是字符串到值之间的映射,因此无法完成此查找,但我发现需要做from module_with_context_var import language一些混乱并且容易在代码库中传播而不是当前上下文的单个包装器,这似乎是 copy_context() 应该是的。

任何以良好方式构造上下文变量获取和设置在中央位置的指针,它也适用于协同例程/异步编程,将不胜感激!

0 投票
1 回答
1834 浏览

python - 使用 asyncio 和 contextvars 在 python 中的两个异步程序之间共享状态

我目前有两个无限异步任务正在运行,并希望在它们之间共享状态。一个任务是一个 websocket 连接,它读取消息然后发送消息,另一个读取传入的光数据。我想在两个任务之间发送一个布尔值,说明 websocket 连接是否成功。

这是我初始化上下文的方式。

这是我的 init_connection 中的代码:

这是它试图在灯光代码中获取当前状态的地方

在 calculate_idle 中,上下文中的变量仍然设置为 false。我不确定如何从 init_connection 内部将其设置为 true。我想将此扩展为更新状态中的其他对象值。任何帮助,将不胜感激!

0 投票
0 回答
116 浏览

python - 使用 contextvars 与设置 Task.current_task() 之间的区别

正如我所见,asyncio 中有两个选项可以共享一个变量。

第一个是使用 contextvars,第二个是为 Task 对象设置自定义属性(感觉像 hack)。

我的问题是这两个选项有什么区别?变量是否设置为相同的范围(例如 contextvars 在 Task.current_task() 的范围内运行?

0 投票
0 回答
269 浏览

python - 同一个 Uvicorn 工作者的并发任务是否使用相同的 python 上下文?

我已经将 FastAPI 用于 Web api,并且我也在使用 python 上下文变量。我知道 Uvicorn 的工作人员可以完成多个并发任务的许多请求。

这些任务是否在相同的上下文中运行?如果我在一个任务中设置了一个上下文变量,它可以在另一个任务中读取吗?

0 投票
0 回答
68 浏览

python - 子类 python ContextVar

是否有一种合法的 Python 方式来存储一个附加属性ContextVar

我不能子类ContextVar,因为TypeError

我可以

但我不确定会不会有副作用

PS 当然,我可以在映射中存储附加值。但我不喜欢这个