繁体   English   中英

无法限制multiprocessing.Pool()中的进程数

[英]Unable to limit number of processes in multiprocessing.Pool()

我试图编写一个程序,该程序可以多次应用某种功能。 为了加快过程,而不是顺序执行,我尝试并行执行该函数。 我在做什么,如下:

import multiprocessing

def start_process():
    logger.debug('Starting {0}'.format(multiprocessing.current_process().name))


pool_size = len(inputs) if len(inputs) < multiprocessing.cpu_count() - 1 else multiprocessing.cpu_count() - 1

with multiprocessing.Pool(processes=pool_size, initializer=start_process) as pool:
    for o, ipt in pool.imap_unordered(train_func, inputs):
        output[(ipt[0], ipt[2])] = o

在上面的代码中,我正在使用参数initializer ,以便能够跟踪应该产生的进程数。 此外,函数train_func是运行优化的函数。

我正在随时有最多32个处理器的服务器上运行代码。 即使我希望“产生”的进程数最多可以达到31,但我可以看到产生了200-300多个进程,并且该程序最终崩溃了。

此外,我得到以下错误:

ERROR; return code from pthread_create() is 11
ERROR; return code from pthread_create() is 11
        Error detail: Resource temporarily unavailable
        Error detail: Resource temporarily unavailable
OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint Try decreasing the value of OMP_NUM_THREADS.
/bin/sh: fork: retry: No child processes
ERROR; return code from pthread_create() is 11
        Error detail: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint Try decreasing the value of OMP_NUM_THREADS.

您能否提供任何提示,说明我实际上如何限制产生的进程数?

您可能应该使用min内置函数。

另外, if __name__ == '__main__': 必须包装初始化代码,如多处理文档中所述。

所以总的来说

import multiprocessing


def start_process():
    logger.debug(
        "Starting {0}".format(multiprocessing.current_process().name)
    )


def train_func(*args):
    pass


def main():
    pool_size = min(len(inputs), multiprocessing.cpu_count() - 1)

    with multiprocessing.Pool(
        processes=pool_size, initializer=start_process
    ) as pool:
        for o, ipt in pool.imap_unordered(train_func, inputs):
            output[(ipt[0], ipt[2])] = o


if __name__ == "__main__":
    main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM