For loop 如何跳过为每个迭代创建新的池进程?
我有以下代码片段For loop 如何跳过为每个迭代创建新的池进程?,for-loop,python-multiprocessing,For Loop,Python Multiprocessing,我有以下代码片段 for self.step in range(0, num_steps): with torch.no_grad(): pool = mp.Pool(4) self.step_iter = np.full(shape=len(self.env.agents), fill_value=self.step, dtype=np.int)
for self.step in range(0, num_steps):
with torch.no_grad():
pool = mp.Pool(4)
self.step_iter = np.full(shape=len(self.env.agents),
fill_value=self.step, dtype=np.int)
# select action for every agent
action_vector = pool.starmap(Trajectory.select_action,
zip(self.replay_buffer,
self.actors,
self.critics,
self.step_iter,
self.action_size))
pool.close()
pool.join()
问题是,对于每个时间步,都会创建一个新的池进程(这需要一些时间)。是否有方法在每次迭代中重复使用相同的池,直到
self.step==num\u steps
?(将注释移动到答案)
池是任务处理程序的集合,将处理队列中的任务。把它想象成商店里处理顾客的收银员。当出纳有空时,他们开始处理下一个客户。pool
是出纳员,starmap
创建要处理的客户行
您只需创建一次池(出纳员):
尝试将pool=mp.pool(4)
放在循环之外(以及close()
和join()
)谢谢您的回答!我在添加你的评论之前就做了。因此,如果一个进程运行多次,就不会有任何问题,对吗?池是一个任务处理程序的集合,它将处理队列中的任务。把它想象成商店里处理顾客的收银员。当出纳有空时,他们开始处理下一个客户。pool
是出纳员,starmap
创建要处理的客户线。非常好的例子!非常感谢@Mike67!
pool = mp.Pool(4) # process handlers
for self.step in range(0, num_steps):
with torch.no_grad():
self.step_iter = np.full(shape=len(self.env.agents),
fill_value=self.step, dtype=np.int)
# select action for every agent
action_vector = pool.starmap(Trajectory.select_action,
zip(self.replay_buffer,
self.actors,
self.critics,
self.step_iter,
self.action_size))
pool.close()
pool.join()