我想在 Python 中跨多个内核运行一个 cpu 密集型程序,并试图弄清楚如何编写 C 扩展来做到这一点。有这方面的代码示例或教程吗?
5 回答
您已经可以将 Python 程序分解为多个进程。操作系统已经将您的进程分配给所有内核。
做这个。
python part1.py | python part2.py | python part3.py | ... etc.
操作系统将确保该部分使用尽可能多的资源。cPickle
您可以使用onsys.stdin
和轻松地沿此管道传递信息sys.stdout
。
如果没有太多的工作,这通常会导致显着的加速。
是的——对讨厌的人来说——有可能构建一个如此折磨的算法,以至于它可能不会加速太多。但是,这通常会为最少的工作带来巨大的好处。
和。
为此目的的重组将完全匹配最大化线程并发所需的重组。所以。从无共享进程并行开始,直到您可以证明共享更多数据会有所帮助,然后转向更复杂的所有共享线程并行。
看看多处理。一个经常被忽视的事实是,操作系统更喜欢不全局共享数据,也不将大量线程塞进一个进程中。
如果您仍然坚持您的 CPU 密集型行为需要线程,请查看使用 C 中的 GIL的文档。这是非常有用的。
这是对 C 扩展的一个很好的使用。您应该搜索的关键字是Py_BEGIN_ALLOW_THREADS
.
http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
PS我的意思是如果你的处理已经在C中,比如图像处理,那么释放C扩展中的锁是好的。如果你的处理代码主要是Python,其他人的建议multiprocessing
更好。用 C 语言重写代码以进行后台处理通常是不合理的。
您是否考虑过使用诸如mpi4py之类的 python mpi 库之一?尽管 MPI 通常用于跨集群分配工作,但它在单个多核机器上运行良好。缺点是您必须重构代码以使用 MPI 的通信调用(这可能很容易)。
多处理很容易。如果那还不够快,那么您的问题很复杂。