从线程记录:当记录到INFO和更高版本时线程退出,在记录到DEBUG时正常运行

时间:2013-07-16 18:30:43

标签: python logging python-2.7 concurrency

我正在编写一个提供PySide UI的程序。 在其中,启动一个线程,设置一系列应该在后台运行的函数,而UI则显示一个进度条。

我正在使用Python 3的concurrent.futures的backport for Python 2.7进行多线程处理。

这是UI方法的样子:

def doPostprocess(self):
    with ThreadPoolExecutor(max_workers=1) as executor:
        future = executor.submit(othermodule.func)
        while not future.done():
            QtGui.qApp.processEvents()
            self.progressbar.setValue(1)
            time.sleep(0.001)
    self.progressbar.hide()

这是我的最小othermodule.func的样子:

def func():
    logger.info("Some informational message")
    time.sleep(15)
    print "And we are done here"

“我们在这里完成”从未打印到stdout,但future对象表示在调用logger.info后立即完成。

有趣的是:当我将调用更改为logger.debug时,一切都按预期工作,即func日志,睡眠15秒然后打印到stdout,同时主线程更新它的进度条。无论为应用程序设置了什么loglevel,都会发生这种情况。

1 个答案:

答案 0 :(得分:1)

您的记录器对象是如何配置的?可以为不同的日志级别配置不同的处理程序,它们可能会失败。见https://docs.djangoproject.com/en/1.3/topics/logging/#configuring-logging

另请参阅此说明http://docs.python.org/2.7/library/logging.html?highlight=logging#thread-safety。可能是这样。

<强>更新

您也可以尝试使用catch-all异常处理程序来查看您的线程内部发生了什么。有点像这样:

def func():
    try:
        logger.info("Some informational message")
        time.sleep(15)
        print "And we are done here"
    except:
        print "We are interrupted"
        pprint.pprint(sys.exc_info())

<强> UPDATE2:

http://hg.python.org/cpython/file/af18829a7754/Lib/concurrent/futures/_base.py#l343所示。 done()方法仅返回worker的状态,不会引发异常。

您可以使用exception()方法检查是否存在异常。此外,这将从func()删除不必要的异常处理。

你的代码可能是(重新引起工人的例外):

def doPostprocess(self):
with ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(othermodule.func)
    while not future.done():
        QtGui.qApp.processEvents()
        self.progressbar.setValue(1)
        time.sleep(0.001)
    if future.exception() is not None:
        raise future.exception()
self.progressbar.hide()