gpt4 book ai didi

python - 如何将多个进程的结果报告回主进程?

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:57 25 4
gpt4 key购买 nike

我目前有 18 个函数对大型 XML 文件执行不同的验证集。我创建了一个扩展 UserWarning 的自定义 ValidationWarning 类,这些函数会针对每次验证失败发出警告。最后,我需要生成包含所有失败的 XLSX 报告(ValidationWarning 对象中提供了每个失败的标识信息)。

我计划为每个函数生成一个进程(我看到了任务被放置在JoinableQueue中的示例,但我不明白为什么这是必要的,除非任务列表将是稍后修改)。验证失败的顺序无关紧要,并且在所有验证完成之前我不需要查看结果。我是否应该替换每个验证函数的 showwarning() 函数以写入 Manager() 返回的 list ?加入所有流程后,我可以将结果导出到 XLSX。这比写入队列更好吗? Queue 可能会更快,但写入结果并不是瓶颈,而且我不明白如何解决以下问题(请参阅 http://docs.python.org/2/library/multiprocessing.html#programming-guidelines ):

This means that whenever you use a queue you need to make sure that all items which have been put on the queue will eventually be removed before the process is joined. Otherwise you cannot be sure that processes which have put items on the queue will terminate.

是否有我忽略的更好方法?据我了解,我无法在主进程中使用 catch_warnings 上下文管理器并期望它捕获来自每个验证进程的警告,尽管我还没有测试它(编辑:我测试了它,并且,正如预期的那样,它失败了)。直接写入 XLSX 而不是先获取所有结果听起来也很困难,因为我需要创建一个空白 XLSX 文件并在每个进程中更新它,同时管理对共享 XLSX 文件的访问。

谢谢!

最佳答案

我在同一家公司工作,在公司邮件列表上看到了你的邮件:)

你为什么不尝试这样的事情:

from multiprocessing import Pool
from time import sleep
import warnings

def catchwarnings(arg):
msg, num = arg
with warnings.catch_warnings(record=True) as w:
if num == 4:
sleep(10)
print 'catchfxn called with num=%d' % num
warnings.simplefilter("always")

# Trigger a warning.
for i in xrange(num):
warnings.warn("{} - #{}".format(msg, i), UserWarning)
return w

def printwarnings(w):
print w

if __name__=='__main__':
p = Pool(18)
for i in [('waaa', 3), ('squeee', 4), ('maaaa', 2)]:
p.apply_async(catchwarnings, args=(i, ), callback=printwarnings)
p.close()
p.join()

给出这个:

catchfxn called with num=3
catchfxn called with num=2
[<warnings.WarningMessage object at 0x10559a4d0>, <warnings.WarningMessage object at 0x10559a710>, <warnings.WarningMessage object at 0x10559a750>]
[<warnings.WarningMessage object at 0x10559a510>, <warnings.WarningMessage object at 0x10559a550>]
catchfxn called with num=4
[<warnings.WarningMessage object at 0x10559a650>, <warnings.WarningMessage object at 0x10559a690>, <warnings.WarningMessage object at 0x10559a4d0>, <warnings.WarningMessage object at 0x10559a710>]

使用回调的代码更加简洁。

关于python - 如何将多个进程的结果报告回主进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21760294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com