【发布时间】:2019-11-04 14:58:03
【问题描述】:
我的 python 程序绝对是 cpu 绑定的,但是 40% 到 55% 的时间是在 z3 求解器中的 C 代码中执行的(它不知道任何针对 gil),其中每次调用 C 函数(@ 987654321@) 需要将近一分钟才能完成(到目前为止parallel_enable 参数仍然导致此函数在单线程模式下工作并阻塞主线程)。
我不能使用多处理,因为 z3_objects 对可序列化不友好(除非这里有人可以证明不是这样)。由于它们是多个任务(每个任务在 dict 中为其他任务添加更多 z3 工作),我最初直接设置了多线程。但是,尽管在求解器中花费了大量时间,但 Gil 对性能的影响肯定大于好处(尤其是超线程)。
但是,如果我在 z3py 模块中手动(通过threading.Lock.aquire())设置了一个阻塞互斥锁,就在从 C 代码切换之后,这将只在所有其他线程都在执行求解器工作时才允许其他线程运行,这是否会删除gil 性能损失(因为它们在执行 python 代码时只有 1 个线程,并且在 z3_optimize_check 之前释放锁之前它总是相同的)?
我的意思是使用 threading.Lock.aquire() 触发调用PyEval_SaveThread() 好像 z3 直接做的一样?
【问题讨论】:
标签: python python-3.x python-multithreading z3py gil