我目前有18个函数对大型XML文件执行不同的验证集。我创建了一个定制ValidationWarning
类,它扩展了UserWarning
,并且这些函数为每个验证失败提出警告。最后,我需要生成包含所有故障的XLSX报告(每个故障的识别信息可在ValidationWarning
对象中找到)。我计划为每个函数产生一个进程(我看到了任务放在JoinableQueue
中的例子,但我不明白为什么这是必须的,除非任务列表稍后会被修改)。验证失败的顺序是不相关的,在所有验证完成之前,我不需要看到结果。我是否应该将showwarning()
函数替换为每个验证函数以写入Manager()
返回的list
?加入所有进程后,我可以将结果导出到XLSX。这比写信给Queue
好吗? Queue
可能会更快,但结果写入不是瓶颈,我不明白,我怎么会解决以下问题(见http://docs.python.org/2/library/multiprocessing.html#programming-guidelines):如何将结果报告给多个进程的主进程?
这意味着,无论你使用一个队列,你需要确保已经放入队列的所有项目在加入之前最终都会被删除。否则,您无法确定将项目放入队列的进程将终止。
有没有更好的方法,我忽略了?据我的理解,我不能在主进程中使用上下文管理器,并期望它能够捕获来自每个验证进程的警告,尽管我还没有对它进行测试(编辑:我测试了它,并且如预期的那样,它失败了)。直接写入XLSX而不是首先获得所有结果也听起来很困难,因为我需要创建一个空白的XLSX文件并在管理对共享XLSX文件的访问的同时在每个进程中进行更新。
谢谢!
你看过'multiprocessing.Pool'吗? – User
'Pool'不在我阅读的教程中(http://pymotw.com/2/multiprocessing/),所以我直到你提到它才知道它。从概念上讲,“Pool”对我来说很有意义 - 修改每个验证函数以返回失败列表,并在结果可用时聚合列表。然而,当我不能使用'catch_warnings'([它不是线程安全的](http://docs.python.org/2/)时,我怎么在每个验证函数中将警告写入局部变量库/ warnings.html#warnings.catch_warnings))?我可以替换'showwarning()',但我没有明确地调用它来选择输出列表。 – user1093967
也许我太担心'catch_warnings'。我一起入侵了一些难看的测试代码(当我编写我的真实代码时,我会考虑使用'map_async'或另一种替代方法),尝试触发与替换和稍后恢复'showwarning()'相关的故障条件,但是我没有。这是我的测试代码,仅在Ideone上托管,因为我的公司阻止了我所知的所有其他事情,即使Ideone不支持'multiprocessing':http:// ideone。com/OQBxHL 我仍然非常害怕违背文档,除非我将线程安全与流程的不同概念混淆...... – user1093967