concurrent_running
简介
并发运行函数,返回结果数组
concurrent_running 并发执行函数库
概述
concurrent_running
是一个用于并发执行函数的工具库,特别适用于处理 IO 密集型任务,如网络请求、文件读写等操作。通过并发执行可以显著提高程序的执行效率。
功能特性
- ✅ 支持并发执行多个函数调用
- ✅ 异常安全:如果某次调用失败,会等待其他调用完 成后抛出异常
- ✅ 高性能:使用 copool 的 co_pool_execute_in 实现
- ✅ 支持两种调用模式:统一函数多参数 / 多函数多参数
API 文档
concurrent_running(function f, array params)
并发执行同一个函数,使用不同的参数。
参数:
f
(function): 要执行的函数params
(array): 参数数组,每个元素是一个数组,包含每次调用函数的参数
返回值:
array
: 结果数组,按照参数数组的顺序返回每次函数调用的结果
示例:
// 定义一个示例函数
int add(int a, int b) {
return a + b;
}
// 准备参数数组
array params = [
[1, 2], // 第一次调用: add(1, 2)
[3, 4], // 第二次调用: add(3, 4)
[5, 6] // 第三次调用: add(5, 6)
];
// 并发执行
array results = concurrent_running.exec((: add :), params);
// results = [3, 7, 11]
concurrent_running_ex(array funcAndParams)
并发执行不同的函数,支持为每个函数指定不同的参数。
参数:
funcAndParams
(array): 函数和参数的组合数组,每个元素包含:[0]
(function): 要执行的函数[1]
(array): 该函数的参数数组
返回值:
array
: 结果数组,按照输入数组的顺序返回每次函数调用的结果
示例:
// 定义示例函数
int multiply(int a, int b) {
return a * b;
}
int subtract(int a, int b) {
return a - b;
}
// 准备函数和参数的组合
array funcAndParams = [
[add, [10, 20]], // 调用 add(10, 20)
[multiply, [3, 7]], // 调用 multiply(3, 7)
[subtract, [100, 30]] // 调用 subtract(100, 30)
];
// 并发执行
array results = concurrent_running.exec_ex(funcAndParams);
// results = [30, 21, 70]
使用场景示例
1. 并发网络请求
// 定义网络请求函数
function fetchData(string url) {
// 模拟网络请求
return http_get(url);
}
// 准备多个URL
array urls = [
["https://api1.example.com/data"],
["https://api2.example.com/data"],
["https://api3.example.com/data"]
];
// 并发请求所有URL
array responses = concurrent_running.exec(fetchData, urls);
2. 并发文件处理
// 定义文件处理函数
function processFile(string filename) {
string content = fs.read_all(filename);
// 进行一些处 理...
return processed_content;
}
// 准备文件列表
array files = [
["file1.txt"],
["file2.txt"],
["file3.txt"]
];
// 并发处理所有文件
array results = concurrent_running.exec(processFile, files);
3. 混合任务并发执行
// 定义不同类型的任务函数
mixed dbQuery(string sql) {
return database_execute(sql);
}
mixed cacheGet(string key) {
return cache_retrieve(key);
}
mixed apiCall(string endpoint) {
return http_request(endpoint);
}
// 组合不同的任务
array tasks = [
[dbQuery, ["SELECT * FROM users"]],
[cacheGet, ["user_session_123"]],
[apiCall, ["https://external-api.com/status"]]
];
// 并发执行所有任务
array results = concurrent_running.exec_ex(tasks);
异常处理
当任何一个并发执行的函数发生异常时,库会等待所有其他函数执行完成,然后抛出异常。这确保了:
- 资源清理:所有启动的并发任务都能正确完成或清理
- 一致性:不会因为单个任务失败而导致其他任务被强制中断
- 调试友好:可以收集到所有任务的执行状态
try {
array results = concurrent_running.exec(someFunction, params);
// 处理成功结果
} catch (e) {
// 处理异常情况
log("并发执行过程中发生错误: " + e);
}
性能说明
- 适用场景:IO 密集型任务(网络请求、文件读写、数据库操作等)
- 不适用场景:CPU 密集型计算任务
- 内存使用:
- 参数:会发生复制,适中的内存开销
- 结果:不发生复制,内存效率高
- 并发机制:基于 copool 的协程池实现
注意事项
- 函数要求:传入的函数必须是可调用的函数对象
- 参数格式:参数数组的每个元素必须是数组形式,即使只有一个参数也要写成
[param]
- 结果顺序:返回的结果数组顺序与输入参数数组顺序一致
- 异常安全:确保在异常情况下程序能够正确处理和清理资源
- 性能考虑:主要适用于 IO 密集型任务,对于 CPU 密集型任务效果有限
导入方式
import pkg.concurrent_running;
确保在使用前正确导入该包。
组件接口
concurrent_running.gs
函数原型 | 函数作用 |
---|---|
array exec_ex(array funcAndParams) | 并发运行函数,返回结果数组 |
array exec(function f, array params) | 并发运行函数,返回结果数组 |