gpt4 book ai didi

c# - 使用 Parallel.ForEach 限制每秒启动的 API 请求数

转载 作者:行者123 更新时间:2023-11-30 17:36:09 24 4
gpt4 key购买 nike

我正在努力改进我的一些代码以提高效率。在原始代码中,我将允许的线程数限制为 5,如果我已经有 5 个事件线程,我会等到一个线程完成后再启动另一个线程。现在我想修改这段代码以允许任意数量的线程,但我希望能够确保每秒只有 5 个线程启动。例如:

  • 第二个 0 - 5 个新话题
  • 第二个 1 - 5 个新主题
  • 第二个 2 - 5 个新线程 ...

原始代码(cleanseDictionary 通常包含数千个项目):

        ConcurrentDictionary<long, APIResponse> cleanseDictionary = new ConcurrentDictionary<long, APIResponse>();
ConcurrentBag<int> itemsinsec = new ConcurrentBag<int>();
ConcurrentDictionary<long, string> resourceDictionary = new ConcurrentDictionary<long, string>();
DateTime start = DateTime.Now;

Parallel.ForEach(resourceDictionary, new ParallelOptions { MaxDegreeOfParallelism = 5 }, row =>
{
lock (itemsinsec)
{
ThrottleAPIRequests(itemsinsec, start);

itemsinsec.Add(1);
}

cleanseDictionary.TryAdd(row.Key, _helper.MakeAPIRequest(string.Format("/endpoint?{0}", row.Value)));
});


private static void ThrottleAPIRequests(ConcurrentBag<int> itemsinsec, DateTime start)
{
if ((start - DateTime.Now).Milliseconds < 10001 && itemsinsec.Count > 4)
{
System.Threading.Thread.Sleep(1000 - (start - DateTime.Now).Milliseconds);
start = DateTime.Now;
itemsinsec = new ConcurrentBag<int>();
}
}

我的第一个想法是将 MaxDegreeofParallelism 增加到更高的值,然后使用一个辅助方法来限制每秒 5 个线程,但我不确定这是否是最好的方法如果是,我可能需要围绕该步骤进行锁定

提前致谢!

编辑我实际上是在寻找一种方法来限制 API 请求而不是实际线程。我以为他们是同一个。

编辑 2:我的要求是每秒发送超过 5 个 API 请求

最佳答案

来自 MS 网站的“Parallel.ForEach”

may run in parallel

如果你想对线程的管理方式进行任何程度的精细控制,这不是方法。
如何创建自己的帮助程序类,您可以在其中使用组 ID 对作业进行排队,允许您等待组 ID X 的所有作业完成,并在需要时生成额外的线程?

关于c# - 使用 Parallel.ForEach 限制每秒启动的 API 请求数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40045143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com