Roger Stuckey の wxPython Multiprocessing コードを読んで、自分で同様のプログラムを作成しようとしました。完全なコードはここにあります。
コードは変更なしで正常に実行されます。ただし、パラメーターself.updateが GUI クラスMyFrameと処理クラスTaskSErverMPの間で渡されていることがわかりました。コード スニペット全体を検索しましたが、コード内で何をしているのかわかりませんでした。初期化も使用もされていません。
クラス MyFrame で:
def OnStart(self, event):
...
self.taskserver.processTasks(self.update)
...
def OnStop(self, event):
...
self.taskserver.processStop(self.update)
...
def update(self, output):
"""
Get and print the results from one completed task.
"""
self.output_tc.AppendText('%s [%d] calculate(%d) = %.2f\n'...
...
# Give the user an opportunity to interact
wx.YieldIfNeeded()
クラス TaskServerMP では:
def run(self):
...
self.processTasks(self.update)
...
def processTasks(self, resfunc=None):
...
def processStop(self, resfunc=None):
...
def update(self, output):
"""
Get and print the results from one completed task.
"""
sys.stdout.write('%s [%d] calculate(%d) = %.2f' % ....
だから私はそれが依存性注入の実践だと思ったが、それ以上のものではない. その後、コードから削除したところ、最も奇妙なことが起こりました。プログラムが機能しなくなりました! GUIが表示され、処理を開始できました。ただし、GUI がハングしただけで、後で Windows がプログラムが応答していないと報告しました。Windowsタスクマネージャーから手動ですべてのpythonw.exeプロセスを強制終了しました。
次に、クラスTaskServerMPの関数processTasksおよびprocessStopの署名と関係があるかどうかを考え始めます。しかし、パラメーターself.updateをオプションの引数resfuncに関連付ける方法が本当にわかりません。
ロジャーのコードには何も問題はないと思います。しかし、コードの理解度をテストするためにソースをひねることができないと気になります。
Windows 7 で Python 2.7 を使用しています。