Python 子线程可以';是否更新父线程变量?
我在中发现了一个非常复杂的问题,在这里分享我的困惑,以帮助我找到解决问题的灵感 处境Python 子线程可以';是否更新父线程变量?,python,python-asyncio,python-multithreading,aiosmtpd,Python,Python Asyncio,Python Multithreading,Aiosmtpd,我在中发现了一个非常复杂的问题,在这里分享我的困惑,以帮助我找到解决问题的灵感 处境 两台运行Red Hat 7.9的服务器 ,对另一个不起作用 问题代码,简化: >>来自aiosmtpd.controller导入控制器 >>>从aiosmtpd.handlers导入接收器 >>>cont=控制器(接收器()) >>>续开始() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/usr/local/lib/python3.6/site-packages/aiosmtpd/cont
- 两台运行Red Hat 7.9的服务器
- ,对另一个不起作用
- 问题代码,简化:
>>来自aiosmtpd.controller导入控制器
>>>从aiosmtpd.handlers导入接收器
>>>cont=控制器(接收器())
>>>续开始()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib/python3.6/site-packages/aiosmtpd/controller.py”,第180行,开始
引发运行时错误(“未知错误,初始化SMTP服务器失败”)
RuntimeError:未知错误,初始化SMTP服务器失败
只有在以下情况下才能生成上述运行时错误
预期流量
start()
->\u run()
->循环。创建服务器()
然后在第一次连接时:
loop.create\u server()
->\u factory\u invoker()
->factory()
属性smtpd
在\u factory\u invoker
中设置:
试试看:
self.smtpd=self.factory()
如果self.smtpd为无:
raise RUNTIMERROR(“工厂()返回无”)
返回self.smtpd
除异常作为错误外:
self.\u线程\u异常=错误
return\u FakeServer(self.loop)
self.\u线程\u异常
解释如下:
如果self.\u thread\u异常不是None:
提升自我。\u线程\u异常
#防御性
如果self.smtpd为无:
引发运行时错误(“未知错误,初始化SMTP服务器失败”)
如您所见,如果self.smtpd
为None
,则只有在\u factory\u invoker()中出现错误时才会发生。如果是这样,错误应该被捕获并记录在self.\u thread\u exception
中。如果self.\u thread\u exception
为None
,则\u factory\u invoker()
已成功,因此self.smtpd
无法None
我解决这个问题的主要问题是,在我所有的测试系统(Windows、Ubuntu、OpenSUSE、MacOS和FreeBSD)上,我从未遇到过类似的错误
所以我被难住了。如果有任何解决这个问题的想法,我将不胜感激。好吧,显然我是被派去做白费力气了
复合因子是因为我已抑制了以下方面的所有异常:
试试看:
self._testconn()
除例外情况外:
#我们完全不关心testconn遇到的异常,
#如果factory()遇到问题,将会发生这种情况。
通过
因此,在self.\u testconn()
中引发的一个非常有用的异常被吞没
显然,self.\u testconn()
尝试连接到主机:端口时失败,因此,\u factory\u invoker()
从未被调用
一旦try..except
块被修改为仅吞咽socket.socket\u timeout
,实际问题就出现了,我们可以快速解决它
这些都记录在中,因此我不会在这里重复它们:-)
感谢所有花时间和精力尝试解决这个难题的人