CadQuery并行化实现与cq_serialize模块导入问题咨询
CadQuery 2.3.0.dev0 并行化与序列化问题解决方法
问题背景
我尝试按照旧讨论中的方式序列化CadQuery以实现并行化,使用了以下代码:
from multiprocessing import Pool import cadquery as cq from cq_serialize import register as register_cq_helper register_cq_helper() def make_box(size: float): return cq.Workplane("XY").box(size, size, size).findSolid() with Pool() as p: boxes = p.map(make_box, range(1, 10))
但在CadQuery 2.3.0.dev0版本中,cq_serialize模块已被移除或重命名,报错ModuleNotFoundError: No module named 'cq_serialize',且项目仓库中已找不到serialize相关内容。
移除register_cq_helper()代码后程序无法终止,推测该函数用于处理内部通知调用。目前内核偶尔会崩溃,希望找到可行的并行化实现方式,或解决模块导入问题。
解决方案
1. 手动处理多进程兼容,替代旧序列化注册
CadQuery新版本已整合序列化支持,无需额外导入cq_serialize。但需规避OCC(OpenCASCADE)的多进程上下文冲突,可通过以下方式实现:
- 使用
spawn上下文创建进程池,避免fork模式带来的OCC环境共享问题 - 确保子进程内独立初始化CadQuery环境
from multiprocessing import get_context import cadquery as cq def make_box(size: float): return cq.Workplane("XY").box(size, size, size).findSolid() if __name__ == '__main__': # 使用spawn上下文避免OCC上下文冲突 with get_context('spawn').Pool() as p: boxes = p.map(make_box, range(1, 10))
2. 尝试CadQuery内置并行方法
部分新版本CadQuery提供了批量操作的并行封装,可直接使用parallel()方法简化逻辑:
import cadquery as cq sizes = range(1, 10) # 并行生成模型 boxes = cq.Workplane().parallel(sizes, lambda size: cq.Workplane("XY").box(size, size, size).findSolid())
3. 降级到支持cq_serialize的旧版本
若必须沿用原代码逻辑,可降级到CadQuery 2.0.x及更早版本,此时cq_serialize模块仍存在:
pip install cadquery==2.0.0
关键注意事项
- OCC库对多进程支持有限,禁止在子进程间共享CadQuery对象
- 若内核仍崩溃,可限制进程池数量(如
Pool(processes=2)),降低资源占用 - 始终用
if __name__ == '__main__':包裹多进程执行代码,避免重复初始化问题
内容的提问来源于stack exchange,提问作者mtooling
相关产品推荐
相关产品推荐

