前言

在需要对大量文件进行相同的操作时,逐个遍历是非常耗费时间的。这时,我们可以借助于Python的多线程操作来大大提高处理效率,减少处理时间。

问题背景

比如说,我们现在需要从一个文件夹下面读取出所有的视频,然后对每个视频进行逐帧处理。由于对视频逐帧处理本身就是比较耗时的任务,如果按照串行的方式顺序处理每个视频文件是效率非常低的,此时,一种比较容易的解决方案是使用Python的多线程进行处理。

定义通用处理函数

并发适合于处理相似的任务。例如我们需要对视频中的每一帧进行处理,处理函数接受的是一个视频名称的列表,对列表内的视频顺序处理,那么我们可以构建以下处理函数:

import cv2

def func(video_names):
    for video_name in video_names:
        cap = cv2.VideoCapture(video_name)
        while True:
            ret, frame = cap.read()
            if ret:
                # process temp frame
            else:
                break

这样,我们只需要将待处理的视频名称按照开启的线程数,划分成多个子列表,就可以进行并发批量处理了。

多线程 Thread

Python中的多线程是通过threading库实现的,除此之外,multiprocessing也可以实现并发处理,二者之间是存在一定差异的。这里我们使用threading来实现同时处理多个不同的文件。

import threading


# video_names_list = [part_names_1_list, part_names_2_list, ..., part_names_k_list]

for part_video in video_names_list:
    thread = threading.Thread(target=func, args=([part_video]))
    thread.start()

在这里,首先将要处理的文件名称列表划分成若干个子列表,然后对每一个子列表开启一个线程进行处理。