gpt4 book ai didi

python - 多进程和多进程没有文件 IO : OSError: [Errno 24] Too many open files

转载 作者:行者123 更新时间:2023-12-03 18:50:34 25 4
gpt4 key购买 nike

摘要 :
我正在尝试使用 multiprocess 和 multiprocessing 来并行处理具有以下属性的工作:

  • 共享数据结构
  • 传递给函数的多个参数
  • 基于当前系统设置进程数

  • 错误 :
    我的方法适用于少量工作,但在较大的任务上失败了: OSError: [Errno 24] Too many open files 尝试的解决方案
    在 macOS Catalina 系统上运行, ulimit -n1024在 Pycharm 中。
    有没有办法避免改变 ulimit ?我想避免这种情况,因为理想情况下,代码可以为各种系统开箱即用。
    我在相关问题中看到过 this thread建议在评论中使用 .join 和 gc.collect ,其他线程建议关闭任何打开的文件,但我不访问代码中的文件。
    import gc
    import time

    import numpy as np

    from math import pi
    from multiprocess import Process, Manager
    from multiprocessing import Semaphore, cpu_count

    def do_work(element, shared_array, sema):
    shared_array.append(pi*element)
    gc.collect()
    sema.release()

    # example_ar = np.arange(1, 1000) # works
    example_ar = np.arange(1, 10000) # fails

    # Parallel code
    start = time.time()
    # Instantiate a manager object and a share a datastructure
    manager = Manager()
    shared_ar = manager.list()
    # Create semaphores linked to physical cores on a system (1/2 of reported cpu_count)
    sema = Semaphore(cpu_count()//2)
    job = []
    # Loop over every element and start a job
    for e in example_ar:
    sema.acquire()
    p = Process(target=do_work, args=(e, shared_ar, sema))
    job.append(p)
    p.start()
    _ = [p.join() for p in job]
    end_par = time.time()

    # Serial code equivalent
    single_ar = []
    for e in example_ar:
    single_ar.append(pi*e)
    end_single = time.time()

    print(f'Parallel work took {end_par-start} seconds, result={sum(list(shared_ar))}')
    print(f'Serial work took {end_single-end_par} seconds, result={sum(single_ar)}')

    最佳答案

    避免更改 ulimit 的方法是确保您的进程池大小不会增加超过 1024。这就是 1000 有效而 10000 失败的原因。
    这是一个使用 Pool 管理进程的示例,它将确保您不会超过 ulimit 值的上限:

    from multiprocessing import Pool

    def f(x):
    return x*x

    if __name__ == '__main__':
    with Pool(5) as p:
    print(p.map(f, [1, 2, 3]))
    https://docs.python.org/3/library/multiprocessing.html#introduction

    other threads recommend closing any opened files but I do not accessfiles in my code


    您没有打开文件,但您的进程正在打开文件描述符,这就是操作系统在此处看到的内容。

    关于python - 多进程和多进程没有文件 IO : OSError: [Errno 24] Too many open files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66988750/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com