【问题标题】:How do I do thread-safe python XML validation?如何进行线程安全的 python XML 验证?
【发布时间】:2015-03-05 15:00:24
【问题描述】:

使用 Python 3.3,我需要根据其 DTD 或 XSD 验证 XML 文档,并且我希望根据每个规范验证许多文档。我将有一个多线程应用程序执行验证。 lxml documentation 解释了如何针对每种规范类型进行验证。

Lxml 将验证错误记录在规范本身的数组中,因此我需要为我执行的每个验证创建一份新的规范副本。

不可能(线程安全)每次都重新解析 DTD 规范,因为我的 DTD 包含其他文件,并且我发现有必要将目录更改为包含 DTD 文件的文件夹才能让 lxml 找到它们.我不能做一个线程安全的 cd,所以我在应用程序启动时阅读了所有规范。

不希望重新解析(XSD 或 DTD)规范,因为它需要 I/O 时间和解析时间。

我尝试复制和深度复制规范(DTD 和 XMLSchema 对象)彻底失败。

有没有办法让 lxml 安全验证?有没有更好的库可以同时支持 XSD 和 DTD 并让我检查线程安全的错误?

【问题讨论】:

  • 如果是 linux,您可以在 DTD/XSD 加载后创建子进程来完成工作。 DTD 不会被复制,因为子进程可以查看父进程的内存,但它对 DTD 所做的任何更改都不会被父进程看到。
  • 行得通!我不得不通过管道发回返回值。谢谢。
  • 太棒了!我会把它变成答案。

标签: python xml multithreading validation lxml


【解决方案1】:

在 linux 上,分叉的进程会获得父级内存的写时复制视图。您可以利用它以很少的开销来处理大型对象,而无需更改父内存空间中的对象。创建对象后,创建通信管道并派生一个孩子来完成这项工作。 multiprocessing 模块的 Process 类可以为您完成繁重的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多