如何在python中使用C扩展来绕过GIL

Sha*_*mez 11 python python-c-extension

我想在多个内核中运行Python中的cpu密集型程序,并试图找出如何编写C扩展来执行此操作.是否有任何代码示例或教程?

S.L*_*ott 9

您已经可以将Python程序分解为多个进程.操作系统已经在所有核心上分配您的流程.

做这个.

python part1.py | python part2.py | python part3.py | ... etc.
Run Code Online (Sandbox Code Playgroud)

操作系统将确保该部件尽可能多地使用资源.通过使用cPickleon sys.stdin和,您可以轻松地沿着此管道传递信息sys.stdout.

没有太多的工作,这往往会导致大幅加速.

是的 - 对于仇恨者 - 有可能构建一个如此折磨的算法,以至于它可能不会加速.然而,这通常会为最小化的工作带来巨大的好处.

和.

为此目的的重组将与最大化线程并发性所需的重组完全匹配.所以.从无共享进程并行性开始,直到您可以证明共享更多数据会有所帮助,然后转移到更复杂的共享 - 所有线程并行性.


Mat*_*ner 7

看看多处理.这是一个经常被忽视的事实,即不全局共享数据,而不是将大量线程填充到单个进程中,这是操作系统更喜欢的.

如果您仍然坚持要求CPU密集型行为需要线程,请查看有关在C中使用GIL的文档.这是非常有益的.


Dan*_*ane -1

您是否考虑过使用像mpi4py这样的 python mpi 库之一?尽管 MPI 通常用于跨集群分配工作,但它在单个多核计算机上运行得很好。缺点是您必须重构代码才能使用 MPI 的通信调用(这可能很容易)。