gpt4 book ai didi

python - Pygame 从 ThreadPool 返回变量,在用 try 赋值之前引用的局部变量,除了

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:58 25 4
gpt4 key购买 nike

我试图从线程接收一些数据,但是每次它通过异常时,它都没有通过 Try 内部,我不知道出了什么问题。我做过一次,到处都找遍了。如果有人可以帮忙。

def receving(name, sock): 
while run:
try:
tLock.acquire()
data = sock.recvfrom(1024)
except:
pass
finally:
tLock.release()
return data

host = socket.gethostbyname(socket.gethostname())
server = (host,5000)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host,port))
s.setblocking(0)


pool = ThreadPool(processes=1)
async_result = pool.apply_async(receving, ('arg qualquer', s))
return_val = async_result.get()
print(return_val)

run = True

while run:
return_val = async_result.get()
print(return_val)

错误信息是这样的:

return data
UnboundLocalError: local variable 'data' referenced before assignment

我已经尝试在 try: 之前初始化,但输出与默认值相同,它以相同的方式跳转 Try: 。也曾尝试使其全局化,但没有成功。

最佳答案

您描述的异常非常简单。这一切都在代码顶部的函数中:

def receving(name, sock):
while run:
try:
tLock.acquire()
data = sock.recvfrom(1024)
except:
pass
finally:
tLock.release()
return data

如果 try block 中的代码引发异常,则对 data 的赋值将不会运行。因此,当您稍后尝试返回数据时,局部变量没有值,因此不起作用。

解决这个具体问题并不难。尝试在 except 子句中放入 data = None 或类似内容,而不仅仅是 pass。这样,无论是否存在异常,data 都会被定义(尽管可能是一个不太有用的值)。

但是,您应该考虑加强 except 子句,这样您就不会忽略所有异常。这通常是一个坏主意,因为它可能会导致程序即使包含真正损坏的代码也能运行。例如,您从未在所显示的代码中定义 tLock,并且 try 会捕获由于尝试获取而导致的 NameError (尽管当 finally 子句尝试释放它时,您仍然会遇到异常,所以我猜这不是代码中的真正问题)。通常您应该指定要捕获的异常类型。我不太确定哪些对于您当前的代码来说是正常的,所以我将让您选择它们​​。

如果没有合理的结果可返回,您也可能会考虑根本不使用 except 子句。这样,异常就会从你的函数中“冒出来”,而调用者有责任处理它。对于某些类型的异常(例如,由编程错误引起的异常,而不是预期的情况),这通常是最好的方法。

不过,您的代码中还有很多其他奇怪的东西,所以我希望您在修复第一个问题后会遇到其他问题。例如,您总是从 while 循环的第一次迭代返回(假设我正确修复了困惑的缩进),因此拥有它根本没有多大意义。如果return data行实际上缩进较少(它与while run处于同一级别,那么循环将使里面的代码运行多次,但永远不会停止运行,因为它内部的任何内容都不会更改全局 run 变量的值。

可能还有其他问题,但对我来说,你想要做什么并不完全明显,所以我无法帮助解决这些问题。即使对于经验丰富的程序员来说,多线程代码和网络编程也可能非常很难掌握,因此,如果您是新手,最好先从更简单的事情开始。

关于python - Pygame 从 ThreadPool 返回变量,在用 try 赋值之前引用的局部变量,除了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46107419/

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