如何跳过为每次迭代创建新的 Pool 进程?

How to skip from creating a new Pool process for every iteration?

我有以下代码片段

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_steps 之前的每次迭代中重复使用同一个池?

(移动评论回答)

pool 是任务处理程序的集合,将处理队列中的任务。可以把它想象成 (4) 个处理顾客排队的商店收银员。当收银员可用时,他们开始处理下一位顾客。 pool 是收银员,starmap 创建要处理的客户行。

您只需创建一次池(收银员):

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()