我正在阅读 Roger Stuckey 的 wxPython Multiprocessing 代码,试图自己制作一个类似的程序。完整的代码可以在这里找到。
代码运行良好,无需任何修改。但是,我发现在 GUI 类MyFrame和处理类TaskSErverMP之间传递了一个参数self.update。我已经在整个代码片段中进行了搜索,但无法弄清楚它在代码中做了什么——它从来没有被初始化和使用过。
在 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。
我认为 Roger 的代码没有任何问题。但是,如果我不能扭曲源代码来测试我对代码的理解,那我会很困扰。
我在 Windows 7 中使用 Python 2.7。