我们遭受了这个bug的影响:
http://bugs.python.org/issue1856 守护线程在解释器关闭期间崩溃。
现在我在寻找解决这个问题的方法。
目前代码看起来是这样的:
while True:
do_something()
time.sleep(interval)
在执行do_something()之前有没有办法检查解释器是否仍然可用?
还是不设置mythread.setDaemon(True),然后检查主线程是否已退出更好?
我们遭受了这个bug的影响:
http://bugs.python.org/issue1856 守护线程在解释器关闭期间崩溃。
现在我在寻找解决这个问题的方法。
目前代码看起来是这样的:
while True:
do_something()
time.sleep(interval)
在执行do_something()之前有没有办法检查解释器是否仍然可用?
还是不设置mythread.setDaemon(True),然后检查主线程是否已退出更好?
回答自己的问题:
我现在使用这种模式:不要设置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
始终为真。也就是说,这个检查完全没有意义。如果子线程是守护线程,则可能起作用。 - freakishparent_thread
的吗? - Koremparent_thread
存储在模块级别。在我的情况下,整个进程/解释器只有一个父线程。 - guettliimport 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:
包装起来)。
守护线程并不一定是坏的,它们肯定可以加快开发过程。您只需要小心使用它们。