gpt4 book ai didi

python - 如何在 asyncio create_task 中更新全局变量

转载 作者:行者123 更新时间:2023-12-05 08:39:10 27 4
gpt4 key购买 nike

我目前有一个未在整个应用程序中设置的全局变量。我有两个文件,其中 file2 从 file1 导入。全局在 file1 中初始化。

这里是初始化全局变量并稍后在 file1 中使用它的代码。

import time
import asyncio

#Initialize global
CONNECTION_OPEN = False

async def calculate_idle(t):
orig_time = t
global CONNECTION_OPEN
while True:
await asyncio.sleep(5)
print("GLOBAL CONNECTION", CONNECTION_OPEN)
if CONNECTION_OPEN:
print("This value is now true")
else:
print("Value is still false")

这是将全局设置为 true 的 websocket 代码。这位于文件 2 中。

import os
import asyncio
import websockets
import json
import threading
import time
from random import randrange
from enum import Enum
from lights import calculate_idle,CONNECTION_OPEN

async def init_connection(message):
#Get global variable to set
global CONNECTION_OPEN
global CLIENT_WS
uri = WS_URI
async with websockets.connect(uri) as websocket:
print("Setting Connection open to true")
CONNECTION_OPEN = True
CLIENT_WS = websocket
# send init message
await websocket.send(message)
print("Connection is open")
while CONNECTION_OPEN:
await handleMessages(websocket, message)
await websocket.send(json.dumps({'type': MessageType.Close.name, 'message': USERNAME}))
await websocket.close()

下面是这段代码在 file2 中的调用方式

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)

asyncio.run(main())

事件顺序是:

  • CONNECTION_OPEN 设置为 false
  • “将连接打开设置为真”是打印
  • 打印“连接已打开”
  • “值仍然是错误的”是重复打印

我希望更新全局变量值,以便打印“此值现在为真”。

最佳答案

这一行并不像你想象的那样:

from lights import calculate_idle,CONNECTION_OPEN 

它不会使 CONNECTION_OPEN 成为 lights.CONNECTION_OPEN 的别名;它将创建一个新的 全局变量(file2 的本地变量),并使用lights.CONNECTION_OPENcurrent 值进行初始化。

在模块之间共享全局的正确方法是仅import lights(无论如何这可能是个好主意)并使用lights.CONNECTION_OPEN

更好的选择是根本不使用全局变量,而是创建一个包含共享状态的可变对象,并将其传递给需要共享它的代码。您还可以将状态添加到其他事物所需的现有对象中,例如 @gold_cy 建议的 asyncio.Event

关于python - 如何在 asyncio create_task 中更新全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60801288/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com