如何限制FFmpeg进程并发数?SemaphoreSlim实现方案咨询
SemaphoreSlim完全适用于你的场景
SemaphoreSlim正是为控制异步/同步操作的并发数量设计的,完美解决你同时启动过多FFmpeg进程导致系统资源耗尽的问题。以下是具体实现步骤和代码修改方案:
1. 声明SemaphoreSlim实例
在你的类中添加一个类级别的SemaphoreSlim对象,指定允许同时运行的FFmpeg进程最大数量(建议根据你的CPU核心数和系统内存调整,比如4、8,可自行测试最优值):
// 类成员变量 private readonly SemaphoreSlim _ffmpegSemaphore = new SemaphoreSlim(4);
2. 包装FFmpeg调用逻辑
创建一个异步方法,用SemaphoreSlim控制ExtractFrames的并发执行:
private async Task RunExtractFramesWithSemaphore(VideoFileModel vid) { // 等待获取信号量 await _ffmpegSemaphore.WaitAsync(); try { // 执行FFmpeg帧提取逻辑 // 如果ExtractFrames是同步方法,直接调用:ExtractFrames(vid); await ExtractFrames(vid); } finally { // 无论执行成功还是失败,都释放信号量 _ffmpegSemaphore.Release(); } }
3. 修改原代码中的任务添加逻辑
把你原来添加ExtractFrames任务的代码替换成调用上面的包装方法:
原代码:
extractFramesTask.Add(System.Threading.Tasks.Task.Run(() => ExtractFrames(vid)));
修改后:
extractFramesTask.Add(RunExtractFramesWithSemaphore(vid));
4. 可选:处理SemaphoreSlim的资源释放
如果你的类实现了IDisposable接口,记得在Dispose方法中释放SemaphoreSlim:
public void Dispose() { _ffmpegSemaphore.Dispose(); // 其他资源释放逻辑 }
原理说明
WaitAsync():当前任务会等待,直到有可用的信号量(即并发数未达上限),才会继续执行后续的FFmpeg调用。Release():执行完FFmpeg任务后释放信号量,让等待中的任务可以开始执行。- 这种方式能严格限制同时运行的FFmpeg进程数量,避免系统内存和CPU被占满导致冻结。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

