我正在编写一个提供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,都会发生这种情况。
答案 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()