嘿,我在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
循环并行的最简单方法是什么?或者这比我假设的任务更重要?
答案 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(进程间通信)机制,如管道,套接字,文件等。这会花费更多资源。此外,产生进程比产生线程慢得多。
其他解决方案包括:
当您必须在进程/线程之间共享数据时,会出现一个大问题。例如,在您的代码中,每个任务都将访问actions
。如果你有分享状态,欢迎来到concurrent programming,这是一项更大的任务,也是在软件中最难做到的事情之一。