我们被这个错误击中:
http://bugs.python.org/issue1856解释器关闭期间守护程序线程段错误。
现在我寻找一种方法来解决这个错误。
目前,代码如下所示:
while True:
do_something()
time.sleep(interval)
有没有办法在 do_something() 之前检查解释器是否仍然可用?
或者最好不要做 mythread.setDaemon(True) 并检查主线程是否已经退出?
我们被这个错误击中:
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
这是来自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:
)。
守护线程不一定不好,它们绝对可以加快开发进程。你只需要小心他们。