前言

最近下载了一批声音文件,大概300多个,电脑cpu本身是六核心十二线程的,如果顺序读取文件,调用本地的语音转文字模型,挨个执行语音转文本,实际查看单次执行任务,cpu工作占比只有20%,那么太慢了。
实际上可以采用线程池原理,将文件分配成300个任务,然后并发执行,让cpu跑满,这样效率就高多了

原理

用一个简单的任务来进行说明
我们创建5个任务,然后交给线程池大小为3的去自由分配任务

#导入多线程模块
from concurrent.futures import ThreadPoolExecutor, as_completed
import threading
#定义执行函数,每个执行的线程说明自己来过即可
def count_task(tid):
    threading_name=threading.current_thread().name
    print(f"任务{tid}开始在线程{threading_name}上执行")
    return f"任务{tid}完成"
#创建线程池
with ThreadPoolExecutor(max_workers=3) as executor:
    # 挨个提交任务到线程池
    futures=[executor.submit(count_task,i) for i in range(5)]
    #as_completed加载任务队列,一旦某个任务完成,就开始返回执行结果
    for future in as_completed(futures):
        result=future.result()
        print(f"{result}")
print("所有任务完成")
任务0开始在线程ThreadPoolExecutor-0_0上执行
任务1开始在线程ThreadPoolExecutor-0_0上执行
任务2开始在线程ThreadPoolExecutor-0_1上执行任务3开始在线程ThreadPoolExecutor-0_0上执行
任务4开始在线程ThreadPoolExecutor-0_1上执行

任务3完成
任务1完成
任务2完成
任务0完成
任务4完成
所有任务完成

这里最核心的就是as_completed函数,它负责在线程执行任务中,有线程完成任务就立刻返回结果。线程完成任务后就触发一个响应事件,as_completed收到后就开始为其返回结果,处理后续等等,这是非常高效的一种高并发手段

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐