【Python Tips】多线程池加速独立运行程序——ThreadPoolExecutor

        在处理数量庞大的数据集或者大批量的循环操作时,程序如果单一运行往往会十分缓慢。假如硬件设备内存足够,CPU性能够好,同时每次循环内的任务都独立(如访问一个文件夹内大量文件)。这种时间复杂度的问题可以尝试使用多线程来处理加速。

        下面记录使用Python标准库中的高级接口——concurrent.futures.ThreadPoolExecutor 来实现多线程加速。

        以一个写入txt文件的操作为例,假如有一批数据,分别要写入不同名的txt文件。

        下面代码实现了这一逻辑的多线程方式。总结来说,使用该库——ThreadPoolExecutor,可以分三步走:

        1.定义循环内部独立的运行程序——write_file(),如果程序不独立那么要加 Lock 锁机制,这里暂不讨论

        2.设置多线程最大线程数

        3.通过submit方法,第一个传定义的独立运行程序名,后面依次传入输入程序的参数即可。

from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm


# 定义独立的写入文件操作
def write_file(filename, content):
    with open(filename, 'w') as f:
        f.write(content)


# 多线程可视化操作
max_threads = 8  # 设置最大线程数
filenums = 10000  # 写入文件总数
filenames = ['', '', '', ...]  # 自定义写入文件名
contents = ['', '', '', ...]  # 自定义写入内容

with ThreadPoolExecutor(max_workers=max_threads) as executor:
    with tqdm(total=filenums, desc='write files', unit='file') as pbar:
        futures = [executor.submit(write_file, filename, content) for filename,content in zip(filenames,contents)]
                for future in futures:
                    future.result()
                    pbar.update(1)

你可能感兴趣的:(Python,python)