在并行循环中调用 API
Call API in parallel loop
我正在使用并行循环将数据从 C# 发布到 API,列表中有 1000 多个对象。响应只有成功或失败。我需要用适当的 ID 在日志文件中记录失败的记录。当我将对象发送到 API 时,我将 ID 保存在循环内的局部变量中并发布数据。当响应返回时,我假设响应是我为该 ID 得到的并写入日志。
ParallelOptions po = new ParallelOptions
{
MaxDegreeOfParallelism = 2
};
Parallel.ForEach(lstPost, po, obj=>
{
string id= obj.Id;
var response= API calls goes here......;
if(response.Status== "ERROR")
{
//log the details
Log.Write(ID : response.Status)
}
}
我的疑问是,有没有机会得到别人对别人id的回应?
只有 API 调用是线程安全的,它才是安全的。这是一个相当安全的假设,但我总是建议在假设任何关于线程安全的事情之前检查文档。
循环体内的id和response是局部变量,不会在任何线程之间共享,因此非常安全。一般来说,线程安全的问题是 共享可变状态 ,如果状态是 non-shared 或不可变,那么它是完全安全的。
您还应该考虑日志记录功能的线程安全性。大多数 log-libraries 提供线程安全的日志记录功能,但再次检查文档以确保安全。直接写入文件可能需要一些同步,如锁,以确保安全。
然而,这样的并行循环将启动两个线程,每个线程都生成 API-call。大部分时间进行 API 调用可能只是在等待结果,在此期间线程只会阻塞,这有点浪费。使用 Parallel.ForEachAsync
或 Task.WhenAll
可以让您的 API 调用异步进行,因此在等待响应时根本不使用任何线程,从而节省一些资源。
我正在使用并行循环将数据从 C# 发布到 API,列表中有 1000 多个对象。响应只有成功或失败。我需要用适当的 ID 在日志文件中记录失败的记录。当我将对象发送到 API 时,我将 ID 保存在循环内的局部变量中并发布数据。当响应返回时,我假设响应是我为该 ID 得到的并写入日志。
ParallelOptions po = new ParallelOptions
{
MaxDegreeOfParallelism = 2
};
Parallel.ForEach(lstPost, po, obj=>
{
string id= obj.Id;
var response= API calls goes here......;
if(response.Status== "ERROR")
{
//log the details
Log.Write(ID : response.Status)
}
}
我的疑问是,有没有机会得到别人对别人id的回应?
只有 API 调用是线程安全的,它才是安全的。这是一个相当安全的假设,但我总是建议在假设任何关于线程安全的事情之前检查文档。
循环体内的id和response是局部变量,不会在任何线程之间共享,因此非常安全。一般来说,线程安全的问题是 共享可变状态 ,如果状态是 non-shared 或不可变,那么它是完全安全的。
您还应该考虑日志记录功能的线程安全性。大多数 log-libraries 提供线程安全的日志记录功能,但再次检查文档以确保安全。直接写入文件可能需要一些同步,如锁,以确保安全。
然而,这样的并行循环将启动两个线程,每个线程都生成 API-call。大部分时间进行 API 调用可能只是在等待结果,在此期间线程只会阻塞,这有点浪费。使用 Parallel.ForEachAsync
或 Task.WhenAll
可以让您的 API 调用异步进行,因此在等待响应时根本不使用任何线程,从而节省一些资源。