【问题标题】:Give a unique name to multiple files with multiprocessing使用多处理为多个文件指定唯一名称
【发布时间】:2019-09-07 09:07:48
【问题描述】:

我正在尝试学习多处理库。这样它就可以工作了:

def generate_files(file_number, directory):
    var02 = str(int(100*random.random()))
    with open(f"{directory}/sample{file_number}.csv", "w") as f:
        f.write(var02)

if __name__ == "__main__":
    N1 = 100
    # create directory for samples
    directory = "samples"
    if not os.path.exists(directory):
        os.makedirs(directory)
    cpu_count = int(os.environ["NUMBER_OF_PROCESSORS"]) # doesn't work on mac
    # generate using all cores
    for i in range(N1):
        process = multiprocessing.Process(target=generate_files, args=[i, directory])
        process.start()

坏事是程序创建了 100 个进程。我想将它们限制为cpu_count。所以它应该看起来像这样:

for i in range(cpu_count):
    process = multiprocessing.Process(target=generate_files, args=[i, directory, cpu_count])

但是这样所有进程都试图写入同一个文件,因为名称是相同的。如果文件数量不是核心的倍数,它也不完美。有什么办法吗?

【问题讨论】:

    标签: python python-3.x multiprocessing


    【解决方案1】:

    您可以将multiprocessingpoolmap 函数一起使用。您可以指定在池中使用多少进程(dfault 为os.cpu_count),然后在可迭代的每个元素上运行一个函数。因此,在您的情况下,您可以执行以下操作:

    from multiprocessing import Pool
    import os
    import random
    
    # create directory for samples
    directory = "samples"
    
    def generate_files(file_number):
        var02 = str(int(100*random.random()))
        with open(f"{directory}/sample{file_number}.csv", "w") as f:
            f.write(var02)
    
    if __name__ == "__main__":
        N1 = 100
    
        if not os.path.exists(directory):
            os.makedirs(directory)
    
        with Pool() as pool:
            pool.map(generate_files, range(N1))
    

    【讨论】:

    • 好一个,但我不明白它应该如何创建文件名?谢谢,我想通了。
    • 什么意思?池是用一些工作进程创建的,然后map 在可迭代的range(N1) 的所有元素上运行generate_files 函数,这是所有数字,从而创建所有想要的文件
    • 谢谢 :) 现在我明白了。
    【解决方案2】:

    我明白了。首先,我需要创建一个文件名列表,并在它为空时完成工作。

    def generate_files(N2, file_numbers, directory):
        while file_numbers:
            file_number = file_numbers.pop()
        var02 = str(int(100*random.random()))
        with open(f"{directory}/sample{file_number}.csv", "w") as f:
            f.write(var02)
    
    
    if __name__ == "__main__":
        N1 = 100
        nums = [e for e in range(100)]
        # create directory for samples
        directory = "samples"
        if not os.path.exists(directory):
            os.makedirs(directory)
        cpu_count = int(os.environ["NUMBER_OF_PROCESSORS"]) # doesn't work on mac
        # generate using all cores
        for i in range(cpu_count):
            process = multiprocessing.Process(target=generate_files, args=[N2, nums, directory])
            process.start()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-20
      • 2018-10-16
      • 2017-07-04
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      相关资源
      最近更新 更多