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

多处理。水塘map不能并行工作

  •  0
  • Temperosa  · 技术社区  · 7 年前

    我想要达到的目标是:

    并行化 一个函数,每次调用生成多个线程,如下所示:

     - PROCESS01 -> 16 Threads
     - PROCESS02 -> 16 Threads
     - ...
     - PROCESSn -> 16 Threads
    

    代码:

    with multiprocessing.Pool(4) as process_pool:
        results = process_pool.map(do_stuff, [drain_queue()])
    

    哪里 drain_queue() 返回项目列表,并

    do_stuff(item_list):
        print('> PID: ' + str(os.getpid()))
        with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
            result_dict = {executor.submit(thread_function, item): item for item in item_list}
            for future in concurrent.futures.as_completed(result_dict):
                pass
    

    thread_function() 处理传递给它的每个项目。

    但是,当执行时,代码输出如下:

    > PID: 1000
    (WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
    > PID: 2000
    (WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
    > PID: 3000
    (WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
    > PID: 3000
    (WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
    

    Here is a screenshot of Task Manager

    我错过了什么?我不明白为什么没有按预期工作。 谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   Temperosa    7 年前

    我发现了问题。的第二个参数 map() 预计会是一个iterable,在我的情况下 包含 单个对象

    怎么了? 这是: [drain_queue()] ,它生成一个包含单个对象的列表。

    在这种情况下,代码

    with multiprocessing.Pool(4) as process_pool:
        results = process_pool.map(do_stuff, [drain_queue()])
    

    部队 multiprocessing.Pool.map 将单个对象“分发”到单个进程,即使它创建 n 进程数,工作仍将由一个进程完成。谢天谢地,与GIL的限制无关。