python - 使用 asyncio 和 contextvars 在 python 中的两个异步程序之间共享状态
问题描述
我目前有两个无限异步任务正在运行,并希望在它们之间共享状态。一个任务是一个 websocket 连接,它读取消息然后发送消息,另一个读取传入的光数据。我想在两个任务之间发送一个布尔值,说明 websocket 连接是否成功。
这是我初始化上下文的方式。
client_connect_var = contextvars.ContextVar('client_connect',default = False)
client_connect_var.set(False)
ctx = contextvars.copy_context()
async def main():
message = json.dumps({'payload': {
'payload'})
loop = asyncio.get_event_loop()
start_light = asyncio.create_task(calculate_idle(3))
await asyncio.gather(init_connection(message), start_light)
ctx.run(asyncio.run(main()))
这是我的 init_connection 中的代码:
async def init_connection(message):
async with websockets.connect(uri) as websocket:
#This should set the global context variable to true
client_connect_var.set(True)
CLIENT_WS = websocket
client_connect = client_connect_var.get()
# send init message
await websocket.send(message)
print("Connection is open")
while client_connect:
await handleMessages(websocket, message)
await websocket.close()
这是它试图在灯光代码中获取当前状态的地方
async def calculate_idle(t):
orig_time = t
while True:
await asyncio.sleep(5)
#This should be true, but it's false
client_connect = client_connect_var.get()
await asyncio.sleep(5)
在 calculate_idle 中,上下文中的变量仍然设置为 false。我不确定如何从 init_connection 内部将其设置为 true。我想将此扩展为更新状态中的其他对象值。任何帮助,将不胜感激!
解决方案
ContextVar
与您尝试使用它的目的相反:它用于任务本地的数据,类似于“任务本地”全局变量。
要在两个任务之间共享数据,您可以使用普通的 Python 共享机制,例如全局变量或普通的可变值(例如,dict 或您选择的类的实例)。您还可以使用同步asyncio.Event
(如https://docs.python.org/3/library/asyncio-sync.html#asyncio.Event)在值更改时通知其他任务。
推荐阅读
- java - Spring Security:工件部署期间的错误由
和 web.xml 中的部分 - python - Python:在文本文件中查找一个字符串,如果同一行中的整数> 1,则打印它
- r - 如何在 R 中获得 PCA 结果
- html - Outlook Windows 10 中 html 电子邮件中的空白
- c# - MassTransit - InMemoryTestHarness 和优先消息传递
- css - @font-face 仅适用于 iOS 上的 Chrome 和 Firefox
- r - 使用 for 循环向多个数据框添加新列
- linux - 不能使用 pip3,给我错误
- swift - Swift Combine removeDuplicates() 未按预期工作
- python - 填充形状的内部