multiprocessing.pool实际上是做什么的?

时间:2019-03-22 21:29:15

标签: python multiprocessing

我的问题:我的代码现在是multiprocessing.pool吗?

def create_empty_file(file_name):
#for file in file_name:
#   print(file)
#create a file named based on "file_name" argument if it doesnt exist in library
    file = open(file_name, "x")
    #delay 30 seconds
    time.sleep(30)
    #close the program
    file.close()

#nodes should retrieve the next file to create as soon as one is done


#this will takes in argument as the file name
if __name__ == "__main__":
    #so takes in the argument (names of files) 
    files = sys.argv[1:-1]
    #number of processes
    n_process = int(sys.argv[-1])
    #create pool
    pool = Pool(processes=n_process)
    pool.map(create_empty_file, files)

我的代码执行了应该执行的操作,但是我不确定我的代码是否按照要求的方式工作。

1 个答案:

答案 0 :(得分:0)

Pool.map本质上是在馈送所有工作进程都从中共享的共享多处理队列。每个工作程序都会运行一个无限循环(如果设置了maxtasksperchild,则为固定循环):

  1. 尝试从队列中提取任务(如果没有可用的任务,则阻塞)
  2. 处理任务
  3. 将结果发送回父级
  4. 转到1

在完成旧任务之前,它不会尝试拉出新任务,因此,如果一名工人正在获得廉价任务,它将执行更多任务;只要任务仍然可用,任何工人都不会闲置。所以,是的,它确实可以满足您的要求。这不是轮循或其他静态工作分配方案可能会使工作人员闲置,而其他人却因等待多个任务而超负荷工作。设置chunksize可以创建该效果,但是在这种情况下,更多的是将每个“块”计为一个任务。然后,这些块将按需分配,而不是按个别任务分配。