【发布时间】:2013-08-26 06:42:45
【问题描述】:
我正在用 python 创建一个简单的多人游戏。我已经使用 python 中的默认线程模块拆分了进程。但是我注意到程序仍然随着其他线程的速度而变慢。我尝试使用多处理模块,但并非所有对象都可以腌制。
除了使用多处理模块来同时运行进程之外,还有其他方法吗?
【问题讨论】:
标签: python multithreading multiplayer
我正在用 python 创建一个简单的多人游戏。我已经使用 python 中的默认线程模块拆分了进程。但是我注意到程序仍然随着其他线程的速度而变慢。我尝试使用多处理模块,但并非所有对象都可以腌制。
除了使用多处理模块来同时运行进程之外,还有其他方法吗?
【问题讨论】:
标签: python multithreading multiplayer
以下是您的选择:
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/
【讨论】:
您需要分析为什么您的程序在其他线程工作时变慢。假设线程正在执行 CPU 密集型工作,减速与被全局解释器锁序列化的线程一致。
如果不详细了解线程正在执行的工作的性质以及必须并行共享的对象的性质,就不可能详细回答。一般来说,您有两种可行的选择:
使用进程,通常通过多处理模块。对象不可提取的典型原因是因为它们包含不可提取的状态,例如闭包、打开的文件句柄或其他系统资源。但是pickle允许对象实现像__getstate__或__reduce__这样的方法来识别对象的状态,使用状态来重建对象。如果您的对象因为它们很大而无法提取,那么您可能需要编写一个 C 扩展来将它们存储在共享内存或内存映射文件中,并且只提取一个在共享内存中标识它们的键。
使用线程,寻找解决 GIL 的方法。如果您的计算集中在几个热点,您可以将这些热点移至 C,并在计算期间释放 GIL。为此,计算不能引用任何 Python 对象,即必须在持有 GIL 时从对象中提取所有数据,并在重新获取 GIL 后将其存储回 Python 世界。
李>【讨论】: