将地图调用并行化的最简单方法是什么?

时间:2016-09-13 11:26:03

标签: python python-3.x parallel-processing

嘿,我在Python中有一些代码,它基本上是一个带有Player对象的World Object。在某一时刻,玩家都获得了世界状态并需要返回一个动作。玩家所做的计算是独立的,只使用相应玩家实例的实例变量。

while True:
    #do stuff, calculate state with the actions array of last iteration
    for i, player in enumerate(players):
        actions[i] = player.get_action(state)

运行内部for循环并行的最简单方法是什么?或者这比我假设的任务更重要?

1 个答案:

答案 0 :(得分:2)

最直接的方法是使用multiprocessing.Pool.map(就像map一样):

import multiprocessing
pool = multiprocessing.Pool()

def do_stuff(player):
    ...  # whatever you do here is executed in another process

while True:
    pool.map(do_stuff, players)

但请注意,这会使用多个进程。由于GIL,无法在Python中进行多线程处理。

通常并行化是通过线程完成的,线程可以访问程序中的相同数据(因为它们在同一个进程中运行)。要在进程之间共享数据,需要使用IPC(进程间通信)机制,如管道,套接字,文件等。这会花费更多资源。此外,产生进程比产生线程慢得多。

其他解决方案包括:

  • 矢量化:将算法重写为矢量和矩阵的计算,并使用硬件加速库来执行它
  • 使用另一个没有GIL的Python发行版
  • 用另一种语言实现你的并行代码并用Python调用它

当您必须在进程/线程之间共享数据时,会出现一个大问题。例如,在您的代码中,每个任务都将访问actions。如果你分享状态,欢迎来到concurrent programming,这是一项更大的任务,也是在软件中最难做到的事情之一。