我正在用 python 创建一个简单的多人游戏。我已经使用 python 中的默认线程模块拆分了进程。但是我注意到程序仍然随着其他线程的速度而变慢。我尝试使用多处理模块,但并非所有对象都可以腌制。
是否有使用多处理模块运行同时进程的替代方法?
我正在用 python 创建一个简单的多人游戏。我已经使用 python 中的默认线程模块拆分了进程。但是我注意到程序仍然随着其他线程的速度而变慢。我尝试使用多处理模块,但并非所有对象都可以腌制。
是否有使用多处理模块运行同时进程的替代方法?
您需要分析为什么您的程序在其他线程工作时变慢。假设线程正在执行 CPU 密集型工作,减速与线程被全局解释器锁序列化是一致的。
如果不了解更多关于线程正在执行的工作的性质以及必须并行共享的对象的性质,就不可能详细回答。一般来说,您有两个可行的选择:
使用进程,通常通过多处理模块。对象不可提取的典型原因是因为它们包含不可提取的状态,例如闭包、打开的文件句柄或其他系统资源。但是pickle允许对象实现类似__getstate__
或__reduce__
识别对象状态的方法,使用状态来重建对象。如果您的对象因为它们很大而无法提取,那么您可能需要编写一个 C 扩展来将它们存储在共享内存或内存映射文件中,并且只腌制一个在共享内存中标识它们的键。
使用线程,寻找解决 GIL 的方法。如果您的计算集中在几个热点,您可以将这些热点移至 C,并在计算期间释放 GIL。为此,计算不能引用任何 Python 对象,即必须在持有 GIL 时从对象中提取所有数据,并在重新获取 GIL 后将其存储回 Python 世界。
以下是您的选择:
MPI4PY: http ://code.google.com/p/mpi4py/
芹菜: http ://www.celeryproject.org/
流程:http : //www.boddie.org.uk/python/pprocess.html
并行 Python(PP): http: //www.parallelpython.com/