gpt4 book ai didi

c# - 在分布式系统中组织事件的执行并避免死锁

转载 作者:行者123 更新时间:2023-12-05 09:34:38 26 4
gpt4 key购买 nike

我在确定系统中事件的优先级时遇到问题。我有一个可以订阅彼此输出的简单类

public interface INode<TIn, TOut> : IBaseNode
{
event EventHandler<TOut> Output;
//Note: subscribe just calls node.Output += this.OnInput
void Subscribe(IBaseNode node);
void OnInput(object sender, TIn input)
}

使用它我可以通过订阅它们的输出将节点链接在一起

CarDealerNode.Subscribe(NewModelNode);
LoggerNode.Subscribe(CarDealerNode);

我的问题是,当事件触发时,它会以半不确定的广度优先方式发生。我想维护这些事件的执行顺序,以便我可以以更动态的方式确定事件执行的优先级。

我的第一印象是使用一些优先级队列来对任务进行排序,但这可能会导致问题,因为较低优先级的事情可能永远不会执行

public class SynchronizationInfo
{
public SyncPriority Priority { get; set; } = SyncPriority.Normal;
public object Sender { get; set; }
public DateTime Created { get; set; } = DateTime.Now;
public Task Operation { get; set; }
}

public class SynchronizationContext
{
public PriorityQueue<SynchronizationInfo> ExecutionQueue = new PriorityQueue<SynchronizationInfo>();
//...
}

但是我仍然无法掌握一种确保不会发生死锁的方法,如果以比执行该优先级更快的速度添加高优先级的事件,则不会执行低优先级的事件.

此外,仅仅因为某些东西的优先级过低并不意味着所有优先级较高的东西都应该先处理,时间是一个重要因素。

是否有可靠有效的推荐方法来处理任务的优先执行。以一种没有任务经历死锁的方式,(例如,时间以一种方式增加优先级,较低的优先级被提升以确保执行)?

最佳答案

我们可以有更多队列,为什么要有一个队列?

这适用于任何恒定的优先级计数,尽管优先级足够低。 (据我所知,您有一个针对它们的 enum,因此可能只有几个优先级)。此外,我们不会使用优先级队列,而是使用几个普通队列。

  • 为每个优先级制作一个队列。任务根据其优先级注册到队列中。为每个任务存储创建时间戳,就像@Funk 所做的那样。
  • 当您希望处理下一个任务时,检查每个队列中可用元素的时间戳。
  • 这使您可以检测长期未完成的低优先级任务并提高它们的优先级。

可以通过多种方式提高优先级。例如:

  • 当队列中的时间足够长时,直接开始执行任务。 (例如 high_creation_time > medium_creation_time + C -> 运行中优先级任务)
  • 将任务重新调度到优先级更高的队列中,而不是直接运行。

哪种方式更适合你,有点不好说。

这种方法的复杂性:

  • 添加新任务:O(1) - 只需将其添加到各自的队列
  • 运行任务:O(1) - 假设我们有固定数量的优先级,这只是检查所有队列并找到下一个应该运行的元素的问题。
  • 重新安排任务(如果适用)- 一推一弹出,因此 O(1)

关于c# - 在分布式系统中组织事件的执行并避免死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66449119/

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