跨模块的上下文

2024-10-02 18:20:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我对asyncio和ContextVars完全不熟悉,我刚刚阅读了3.7中的新内容,发现了{},我很难理解它的用法,我知道它在协同程序中是有帮助的,而不是使用thread.local应该使用ContextVars。但是没有一个官方文件和谷歌搜索结果能帮助我真正理解它的目的。在

那么,convertextVar是跨模块共享的吗?我试过了:

在示例.py在

from contextvars import ContextVar

number = ContextVar('number', default=100)
number.set(1)

然后我尝试导入数字.py在

^{pr2}$

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

有人能帮我理解一下吗?在


Tags: 模块文件py目的asyncionumber内容用法
3条回答

您正在重新指派number的值。直接从模块调用变量,例如example.number.get()。在


一个简单的应用程序正在替换一个全局变量。在

给定

import random
import contextvars as cv

编码

在这里我们将模拟随机行走。与全局变量一样,我们可以在函数之间共享状态:

^{pr2}$

演示

ContextVar充当由随机事件更新的全局变量:

random_walk(1)
# 'R'
random_walk(2)
# 'RLL'
random_walk(3)
# 'RLLLRL'

除了常规的全局变量,ContextVar

你又给这个数字赋值了。这就是为什么它显示200个最新更新。在

假设您的用例是使用pythonthread.local将线程全局变量存储在多线程应用程序中。在

例如,您将djangorequest全局存储在thread.local

  • 您的所有代码都可以访问当前(并且正确)request实例
  • 它可以工作,因为每个django HTTP请求都在它自己的python线程中处理

不,想象一下,在asyncio中,HTTP请求作为在同一python线程中执行的非阻塞代码来处理。在

  • 存储在thread.local中的HTTP请求不起作用,因为多个并发请求在同一个python线程中被处理
  • 结果是,您重写了相同的thread.local变量,所有代码都可以访问最新的(不正确的)request实例

在本例中,您将使用ContextVars,它被设计成在同一个python线程中运行的非阻塞并发作业中用于此用例。在

相关问题 更多 >