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