PySide UI を提供するプログラムを書いています。その中で、UI にプログレス バーが表示されている間、バックグラウンドで実行されるはずの一連の機能を設定するスレッドが開始されます。
concurrent.futures
マルチスレッド用に Python 2.7 用の Python 3 のバックポートを使用しています。
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"
「We are done here」は stdout に出力されることはありませんが、future
オブジェクトは への呼び出しの直後に完了したことを通知しlogger.info
ます。
面白いことに、呼び出しを に変更するとlogger.debug
、すべてが期待どおりに動作します。つまり、func
ログが記録され、15 秒間スリープしてから stdout に出力され、その間ずっとメイン スレッドがプログレス バーを更新します。これは、アプリケーションに設定されているログレベルに関係なく発生します。