gpt4 book ai didi

multithreading - Azure QueueClient MaxConcurrentCalls 不起作用

转载 作者:行者123 更新时间:2023-12-03 12:47:19 32 4
gpt4 key购买 nike

我的任务是提高处理队列消息的辅助角色的性能。

它使用 queueclient.OnMessage 模型,MaxConcurrentCalls 设置为 1。

在处理过程中,thread.sleep 会持续 5 分钟,这会影响整体性能,即如果队列中有 10 条消息,则在处理第 10 条消息之前至少需要 45 分钟

我想如果我将 MaxConcurrentCalls 更改为 5,那么它应该并行处理 5 条消息,并将等待时间减少 25 分钟,但这不起作用:(

我还尝试将 OnMessageAsync 与 MaxConcurrentCalls 一起使用,但没有成功。下面是我尝试过的片段,

.OnMessageAsync( async (brokeredMessage) =>
{
bool shouldAbandon = false;
try
{
logger.Debug("Rcvd:" + brokeredMessage.SequenceNumber);
SomeTask(brokeredMessage);
await brokeredMessage.CompleteAsync();
}
catch (Exception ex)
{
logger.Error(String.Format("An Error occured {0}", ex.ToString()));
shouldAbandon = true;
}
if (shouldAbandon)
{
await brokeredMessage.AbandonAsync();
}
}, new OnMessageOptions { AutoComplete = false, MaxConcurrentCalls = 10 });

private void SomeTask(BrokeredMessage bm)
{
logger.Debug("id: " + bm.MessageId + "on thread: " + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(30 * 1000);
logger.Debug("seq: " + bm.SequenceNumber);
logger.Debug("body: " + bm.GetBody<string>());
}

我能想到的最后一个选择是在 OnMessage 事件上启动一个新任务。有几件事我需要处理(确保已完成的任务从集合/主线程中删除,并从 BrokeredMessage 传递一个对象,因为 BrokeredMessage 已被释放,所以我无法在任务线程上使用)并且我有理智也测试了它,但我不相信这是最好的解决方案。

最佳答案

SomeTask 实现替换为以下内容:

async Task SomeTask(BrokeredMessage bm)
{
logger.Debug("id: " + bm.MessageId + "on thread: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(30 * 1000).ConfigureAwait(false);
logger.Debug("seq: " + bm.SequenceNumber);
logger.Debug("body: " + bm.GetBody<string>());
}

当 Thread.Sleep 与同一线程上的 async 混合使用时(在您的情况下),它会导致线程“停止”所有任务。由于没有 UI 工作,因此最好在异步操作上使用 .ConfigureAwait(false) 来允许调度程序管理要在哪个线程上执行。

关于multithreading - Azure QueueClient MaxConcurrentCalls 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39530487/

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