代码之家  ›  专栏  ›  技术社区  ›  Pranjal

如何池。map()在内部分配工作?

  •  4
  • Pranjal  · 技术社区  · 8 年前

    我是个新手 multiprocessing 图书馆,并对其 Pool map() . 假设我有4个工作线程和6个任务要完成。我所做的是(使用 multiprocessing.dummy 因为我想产生线程,而不是进程)

    from multiprocessing.dummy import Pool as ThreadPool
    
    def print_it(num):
        print num
    
    def multi_threaded():
        tasks = [1, 2, 3, 4, 5, 6]
        pool = ThreadPool(4)
        r = pool.map(print_it, tasks)
        pool.close()
        pool.join()
    
    multi_threaded()
    

    1. 它是否先生成4个线程,完成前4个任务,然后让线程消亡。然后为其余任务生成2个新线程?
    2. 它是否生成4个线程,为其分配4个任务,一旦某个线程完成其任务,就将新任务分配给同一个线程。
    3. 另一种方式。

    这一见解将很有帮助,因为它将帮助我考虑使用 Pool.map()

    1 回复  |  直到 8 年前
        1
  •  1
  •   Hannu    8 年前

    这取决于您如何定义池。

    正如您在示例中所做的那样,您的(2)发生了。您的线程或进程(取决于池)在初始化池时立即启动(发生在 Pool__init__()

    不过,你可以用不同的方式定义它。您可以添加 maxtasksperchild 参数。一旦一个工人完成了这么多任务,它就会退出,并立即启动一个新的工人(无需先给它一个任务,工人一退出就会启动它)。这是在池类中管理的 Pool._maintain_pool() Pool._repopulate_pool()

    如果你想让你的员工从一开始就开始工作,然后无限期地运行,那就按照你现在所做的去做,事情就是这样。如果您希望员工在开始时启动,但在完成一系列任务后退出并更新自己(即使必要时只有一项任务),请使用 maxtasksperchild