13

我们被这个错误击中:

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

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

目前,代码如下所示:

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

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

或者最好不要做 mythread.setDaemon(True) 并检查主线程是否已经退出?

4

2 回答 2

9

回答自己的问题:

我现在使用这种模式:不要 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

于 2013-08-07T09:01:58.923 回答
0

这是来自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:)。

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

于 2013-08-07T08:52:51.063 回答