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

2024-04-26 15:06:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小脚本,可以完成一些简单的任务。运行python3.7。在

其中一个任务必须将一些文件合并在一起,这可能会占用一些时间。在

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

而不是等待它完成一个目录,然后进入下一个目录,然后等待,然后进入下一个目录,等等。。。在

我想利用horsepower/cores/threads让脚本一次将多个目录中的PDF合并在一起,这样可以节省时间。在

我有这样的东西:

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

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

^{pr2}$

这很好——但是merge_pdfs在目录中有大量PDF的情况下运行缓慢。在

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

我看了asynciomultithreading和大量的小片段,但似乎不能让它发挥作用。在


Tags: 文件函数目录脚本利用ifpdfos
1条回答
网友
1楼 · 发布于 2024-04-26 15:06:27

你可以这样做:

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使用率,这应该会有所帮助。但如果瓶颈是硬盘驱动器,这可能会使事情变得更糟,因为从一个物理硬盘并行读取多个文件通常比连续读取要慢。尝试使用不同值的n\u processes。在

顺便说一句,要从iterable生成列表,请使用list()file_list = list(os.listdir(directory))。由于listdir()返回List,所以您只需编写file_list = os.listdir(directory)

相关问题 更多 >