1# Function Flow Runtime并发范式 2 3<!--Kit: Function Flow Runtime Kit--> 4<!--Subsystem: Resourceschedule--> 5<!--Owner: @chuchihtung; @yanleo--> 6<!--Designer: @geoffrey_guo; @huangyouzhong--> 7<!--Tester: @lotsof; @sunxuhao--> 8<!--Adviser: @foryourself--> 9 10为了应对实际业务中,任务执行顺序固定、灵活优先级调度以及复杂的任务依赖关系等场景,FFRT支持串行队列、并发队列和图依赖三种不同的并发范式。 11 12## 串行队列(Serial Queue) 13 14串行队列并发范式常用于解决以下场景中的问题: 15 161. **顺序执行**: 某些任务需要按特定顺序执行,串行队列可以确保任务按添加的顺序逐一执行,避免了乱序执行带来的数据不一致性和错误。 172. **数据安全**: 在并发环境中访问和修改共享资源时,容易出现竞争条件。使用串行队列可以避免多个线程同时访问共享资源,确保数据的一致性和安全性。 183. **任务协调**: 串行队列可以用来协调复杂任务的执行顺序,例如在进行多个依赖关系的任务时,确保前一个任务完成后再开始下一个任务。 194. **简化开发**: 相较于手动管理锁和同步机制,串行队列的使用更加简洁明了。开发者只需将任务添加到队列中,系统会自动处理任务的调度和执行顺序,减少了开发和调试的复杂性。 205. **资源管理**: 在某些情况下,限制并发任务的数量可以避免资源争用和过载。串行队列可以控制并发任务的数量,优化系统资源的使用。 21 22 23 24串行队列并发范式开发样例可以参考[串行队列(C)](ffrt-concurrency-serial-queue-c.md)/[串行队列(C++)](ffrt-concurrency-serial-queue-cpp.md) 25 26## 并发队列(Concurrent Queue) 27 28并发队列并发范式常用于解决以下场景中的问题: 29 301. **提高并发度**: 并发队列允许多个任务同时执行,充分利用多核处理器的计算能力,显著提高系统的并发度和整体性能。 312. **资源高效利用**: 并发队列能将任务分配到可用的CPU核心上,优化资源的使用,减少任务的等待时间和资源争用。 323. **任务调度灵活**: 并发队列允许任务按照不同的优先级(Priority)和QoS进行调度,确保关键任务能够及时执行,提高系统的响应速度。 334. **避免资源冲击**: 并发队列允许设置最大并发度,避免任务并发过多对系统资源造成的冲击,从而保证系统的稳定性和性能。 34 35 36 37并发队列并发范式开发样例可以参考[并发队列(C)](ffrt-concurrency-concurrent-queue-c.md)/[并发队列(C++)](ffrt-concurrency-concurrent-queue-cpp.md) 38 39## 图依赖并发(Task Graph) 40 41图依赖并发范式常用于解决以下场景中的问题: 42 431. **复杂任务依赖关系**: 在许多实际应用中,任务之间存在复杂的依赖关系。图依赖并发范式通过使用有向图来表示任务及其依赖关系,能够清晰地管理和调度这些任务。 442. **动态任务调度**: 当任务的依赖关系和执行顺序需要根据运行时的条件动态决定时,图依赖并发范式可以灵活地调整任务的调度,确保任务按正确的顺序执行。 453. **并行任务执行**: 图依赖并发范式允许多个不相互依赖的任务并行执行,从而最大化利用系统的计算资源,提高并发度和执行效率。 464. **结构化并发**:图依赖并发范式中可以通过明确的任务生命周期和依赖关系,确保并发任务的创建和完成在代码结构中清晰可见,减少并发编程的复杂性和错误。 47 48 49 50图依赖并发范式开发样例可以参考[图依赖并发(C)](ffrt-concurrency-graph-c.md)/[图依赖并发(C++)](ffrt-concurrency-graph-cpp.md) 51 52## 任务伙伴(Job Partner) 53 54从API version 20开始,FFRT支持Job_Partner(任务伙伴)功能。任务伙伴任务并发范式常用于解决以下场景中的问题: 55 561. **多线程协作**: 在许多实际应用中,某些功能需要在特定环境进行运行,而其他功能可以在任何环境运行,这个时候需要多线程协作,部分功能在A线程运行,然后回到B线程,最后再回到A线程。 57 58  59 602. **动态并发调度**: 有些场景并发任务数量动态变化,时多时少,所以可以通过动态调整worker数量来最大提升性能,降低调度开销。 61 62  63 64 图中的参数如下所示: 65 - `job_num` 提交的任务数。 66 - `partner_num` worker数量。 67 - `threshold` 表示任务堆积到指定数量后才会启动worker。 68 - `ratio` 表示任务数和worker数的比例。 69 - `max` 表示最大worker数。 70 71协作并发范式开发样例可以参考[任务伙伴(C++)](ffrt-concurrency-job-partner-cpp.md) 72