【问题标题】:Detect Interpreter shut down in daemon thread检测在守护线程中关闭的解释器
【发布时间】:2013-08-08 12:57:10
【问题描述】:

我们遇到了这个错误:

http://bugs.python.org/issue1856 解释器关闭期间守护程序线程段错误。

现在我正在寻找一种方法来解决这个错误。

目前代码如下:

while True:
    do_something()
    time.sleep(interval)

有没有办法在 do_something() 之前检查解释器是否仍然可用?

还是不做 mythread.setDaemon(True) 并检查主线程是否退出更好?

【问题讨论】:

标签: python multithreading


【解决方案1】:

回答自己的问题:

我现在使用这个模式:不 setDaemon(True),不使用 sleep(),使用 parent_thread.join()

while True:
    parent_thread.join(interval)
    if not parent_thread.is_alive():
        break
    do_something()

相关:http://docs.python.org/2/library/threading.html#threading.Thread.join

【讨论】:

  • 我不明白。如果子线程不是守护进程,那么父线程将永远不会死亡(在子线程之前),因此父线程上的is_alive 将始终为真。 IE。整个检查毫无意义。如果子线程是守护进程,它可能会起作用。
  • @freakish 如果父(主)线程已结束,is_alive() 将返回 False,但子线程仍处于活动状态。它适用于我的测试。
  • @guettli 嗨,这里有类似的问题。你能帮忙解释一下你是如何获得parent_thread的吗?
  • @Korem 我将parent_thread 存储在模块级别。就我而言,整个进程/解释器只有一个父线程。
  • 我看到一个类似的问题,我的诅咒屏幕界面是一个线程,其他都是主线程。退出由子线程启动(按“q”)-这给了我在 linux 上的段错误-要尝试这个解决方案-感谢发帖!
【解决方案2】:

这是来自 threading.py 模块的代码:

import sys as _sys

class Thread(_Verbose):
    def _bootstrap_inner(self):
        # some code

            # If sys.stderr is no more (most likely from interpreter
            # shutdown) use self._stderr.  Otherwise still use sys (as in
            # _sys) in case sys.stderr was redefined since the creation of
            # self.
            if _sys:
               _sys.stderr.write("Exception in thread %s:\n%s\n" % 
                   (self.name, _format_exc()))
            else:
               # some code

可能会有所帮助。您看到的错误来自else 语句。所以在你的情况下:

import sys as _sys

while True:
    if not _sys:
        break/return/die/whatever
    do_something()
    time.sleep(interval)

我不确定它是否有效(请注意,解释器关闭可能发生在 do_something 内,因此您应该使用 try:except: 包装所有内容)。

守护线程不一定不好,它们绝对可以加快开发进程。你只需要小心他们。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多