多处理pool.map是否同时运行作业?

时间:2016-08-04 15:31:06

标签: python multiprocessing pool

我浏览了文档https://docs.python.org/2/library/multiprocessing.html#managers和 我不太明白“结果准备就会阻止”是什么意思 这是否意味着其中任何一个:

  1. 对于pool.map(worker_num = 5),这5名工作人员将一个接一个地工作,结果会一直阻止直到准备好了吗?

  2. 对于pool_job_1 = pool.map(4);pool_job_2 = pool.map(4). pool_job_2只会在pool_job_1完成后开始?

  3. 我现在赞成第二次解释。这对我正在做的事情很重要,因为我想按顺序运行它,一次只运行一个。我怎样才能做到这一点?我可以使用lock并将其作为参数传递给Process:

    for item in my_list:
        Process(func, (item,lock...))
    

    在我的函数中,我添加lock.acquire()lock.release()以确保它一次运行一个进程。这种方法的问题是:我将创建太多的进程(processes = length of my_list)。

    我正在考虑在地图功能中添加锁定或在池中设置processes = 1

    更新

    通过玩虚拟示例,人们应该清楚地了解地图功能正在做什么:

    from multiprocessing import Process, Pool
    import os
    import time
    
    def sleeper(args):
       name = args[0]
       seconds = args[1]
       print ('starting child process with id:%d '% os.getpid())
       print ('parent process:%d' % os.getppid())
       print ('sleeping for %s ' % seconds)
       time.sleep(seconds)
       print ("Done sleeping")
    
    
    # if __name__ == '__main__':
    #    print ("in parent process (id %d)" % os.getpid())
    #    for j in reversed(range(10,15)):
    #       p = Process(target=sleeper, args=('bob', j))
    #       p.start()
    #       print ("in parent process after child process start")
    #       print ("parent process about to join child process")
    #       p.join()
    #       print ("in parent process after child process join")
    #       print ("parent process exiting with id %d "% os.getpid())
    #       print ("The parent's parent process:%d" % os.getppid())
    
    if __name__ == '__main__':
       print ("in parent process (id %d)" % os.getpid())
       pool = Pool(1)
       pool.map(sleeper, [('bob',x) for x in reversed(range(10,15))], 1)
    

    它在开始时启动任何进程,并将“iterable”划分为这些进程。但我之前错过的一件事是:它不会在中间创建新进程,而是始终使用它在一开始就创建的进程。

0 个答案:

没有答案