如何使用 python 脚本 运行 限制循环中的多线程数量?

How to run limited number of Multithreads in loop using python script?

考虑原始视频文件夹中的 20 个视频文件。最初通过将 5 个视频分配给 5 个单独的线程来快速转发它们。 这个过程应该等到 5 个线程完成他们的任务,完成后,快进的视频必须保存在 converted 文件夹和原始视频必须移动到新文件夹。但是在每个循环中它只需要处理 5 个线程等待并处理下一组线程。 这是代码:

from moviepy.editor import *
import os
import glob
from natsort import natsorted
from threading import Thread
import datetime

def fast(path,thread_name):
    if os.path.splitext(path)[1] == '.mp4':
        print("Start : " + str(thread_name) + "  -  " + str(datetime.datetime.now()))
        clip = (VideoFileClip(path).fx(vfx.speedx, 5))
        clip.to_videofile('A:/Internship/Assignment-1/output_folders/multithread_fast_output/'+thread_name + '.mp4', codec='libx264')
        print("End : " + str(thread_name) + "  -  " + str(datetime.datetime.now()))

for i, filename in enumerate(glob.glob("A:/Internship/Assignment-1/videos/*.mp4"), 1):
    thread_name = f"t{i}"
    Thread(target=fast, args=(filename, thread_name)).start()

我稍微修改了您的代码以使用 ThreadPoolExecutor 而不是 Thread 这里的想法是创建一个包含 5 个工作线程的池(因为您希望同时激活 5 个),然后将 fast 函数添加到作业队列。 5 线程将 运行 fast 函数,当任何线程执行完该函数时,它将占用队列中的下一个任务。

from moviepy.editor import *
import os
import glob
from natsort import natsorted
import datetime

from concurrent.futures import ThreadPoolExecutor


def fast(path, thread_name):
    if os.path.splitext(path)[1] == '.mp4':
        print("Start : " + str(thread_name) + "  -  " + str(datetime.datetime.now()))
        clip = (VideoFileClip(path).fx(vfx.speedx, 5))
        clip.to_videofile('A:/Internship/Assignment-1/output_folders/multithread_fast_output/' + thread_name + '.mp4', codec='libx264')
        print("End : " + str(thread_name) + "  -  " + str(datetime.datetime.now()))


with ThreadPoolExecutor(5) as pool:
    for i, filename in enumerate(glob.glob("A:/Internship/Assignment-1/videos/*.mp4"), 1):
        pool.submit(fast, filename, f"t{i}")