如何使用 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}")
考虑原始视频文件夹中的 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}")