![](/img/trans.png)
[英]Asynchronously run several instances of the same function with output
[英]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。
我已经看过asyncio
, multithreading
和asyncio
在的小片段,但似乎无法正常工作。
您可以执行以下操作:
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.