首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子线程不能更新父线程变量?

子线程不能更新父线程变量?
EN

Stack Overflow用户
提问于 2021-02-16 09:30:10
回答 1查看 142关注 0票数 2

我在aiosmtpd/244中发现了一个非常令人费解的问题,我在这里分享了我的困惑,以帮助我找到如何排除故障的灵感。

情况

  • 两个运行RedHat7.9的服务器
  • 一体式,对另一个不起作用
  • 有问题的代码,简化如下:
代码语言:javascript
复制
>>> from aiosmtpd.controller import Controller
>>> from aiosmtpd.handlers import Sink
>>> cont = Controller(Sink())
>>> cont.start()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/aiosmtpd/controller.py", line 180, in start
    raise RuntimeError("Unknown Error, failed to init SMTP server")
RuntimeError: Unknown Error, failed to init SMTP server

上面的RuntimeError只能在仍然没有的情况下才能生成。

期望流量

start() -> _run() -> loop.create_server()

然后在第一次连接时:

loop.create_server() -> _factory_invoker() -> factory()

属性smtpd是在_factory_invoker这些线中设置的。

代码语言:javascript
复制
        try:
            self.smtpd = self.factory()
            if self.smtpd is None:
                raise RuntimeError("factory() returned None")
            return self.smtpd
        except Exception as err:
            self._thread_exception = err
            return _FakeServer(self.loop)

self._thread_exception这些线中解释

代码语言:javascript
复制
        if self._thread_exception is not None:
            raise self._thread_exception
        # Defensive
        if self.smtpd is None:
            raise RuntimeError("Unknown Error, failed to init SMTP server")

如您所见,如果self.smtpdNone,那么只有在_factory_invoker()中出现错误时才会发生这种情况。如果是这样的话,错误应该被捕获并记录在self._thread_exception中。如果self._thread_exceptionNone,那么_factory_invoker()就成功了,因此self.smtpd不可能是None

我在故障排除方面的主要问题是,在我的所有测试系统(Windows、Ubuntu、OpenSUSE、MacOS和FreeBSD)上,我从未遇到过类似的错误。

所以我很困惑。我希望有任何解决这个问题的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-17 16:15:06

好吧,很明显我是被派去做白日梦的。

复合因素是因为I在这些线中抑制了 ALL exceptions

代码语言:javascript
复制
        try:
            self._testconn()
        except Exception:
            # We totally don't care of exceptions experienced by _testconn,
            # which _will_ happen if factory() experienced problems.
            pass

因此,self._testconn()中出现的一个非常有用的异常被吞没了。

显然,self._testconn()未能连接到host:port,因此_factory_invoker() 从未被调用。

一旦try..except块被修改为只吞咽socket.socket_timeout,实际的问题就会抬头,我们可以快速地修复它。

这都是在aiosmtpd/244中记录的,因此我不会在这里重复它们:-)

感谢所有花时间和精力来解决这个难题的人!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66221795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档