繁体   English   中英

python中同一函数的多个实例异步

[英]Multiple instances of the same function asynchronously in python

我有一个小脚本,可以执行一些简单的任务。 运行Python 3.7。

任务之一是将一些文件合并在一起,这可能会花费一些时间。

它循环遍历多个目录,然后每个目录都传递给函数。 该功能只是循环遍历文件并合并它们。

而不是等待它完成一个目录,然后进入下一个目录,然后等待,然后进入下一个目录,依此类推...

我想利用功能/内核/线程使脚本一次将多个目录中的PDF合并在一起,这样可以节省时间。

我有这样的事情:

if multi_directories:
    if os.path.isdir('merged'):
        pass
    else:
        os.makedirs('merged')
    for directory in multi_directories:
        merge_pdfs(directory)

我的合并PDF函数如下所示:

def merge_pdfs(directory):
    root_dir = os.path.dirname(os.path.abspath(__file__))
    merged_dir_location = os.path.join(root_dir, 'merged')
    dir_title = directory.rsplit('/', 1)[-1]
    file_list = [file for file in os.listdir(directory)]
    merger = PdfFileMerger()
    for pdf in file_list:
        file_to_open = os.path.join(directory, pdf)
        merger.append(open(file_to_open, 'rb'))
        file_to_save = os.path.join(
            merged_dir_location,
            dir_title+"-merged.pdf"
        )
    with open(file_to_save, "wb") as fout:
        merger.write(fout)
    return True

这很好用-但merge_pdfs在目录中存在大量PDF的某些情况下运行缓慢。

本质上-我希望能够遍历multi_directories并为每个目录创建一个新线程或进程,并同时合并PDF。

我已经看过asynciomultithreadingasyncio在的小片段,但似乎无法正常工作。

您可以执行以下操作:

from multiprocessing import Pool
n_processes = 2
...
if multi_directories:
    if os.path.isdir('merged'):
        pass
    else:
        os.makedirs('merged')
    pool = Pool(n_processes)
    pool.map(merge_pdfs, multi_directories)

如果瓶颈是CPU使用率,应该会有所帮助。 但是,如果瓶颈是HDD,可能会使情况变得更糟,因为从一个物理HDD并行读取多个文件通常比连续读取它们要慢。 尝试使用不同的n_processes值。

顺便说一句,要使列表从可迭代使用list()file_list = list(os.listdir(directory)) 而且由于listdir()返回List ,所以您只需编写file_list = os.listdir(directory)

暂无
暂无

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

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