【发布时间】:2022-02-15 20:30:18
【问题描述】:
我遇到了一个我可以轻松定义的问题,但我一生似乎无法消化 MSDN 以获得最佳解决方案。自从我不得不真正考虑 UI 响应之外的并行处理已经有一段时间了。
也就是说,我有一个需要处理的并发任务集合。例如,它可能正在按类型(Consumer1,Consumer2,Consumer3...Consumer[N])向各种消费者加载数据,发送数据的基础任务对于每个任务都是相同的,但每个消费者一次只能接受一个源
基本上,我希望尽可能多地并行处理,但需要注意的是,我一次只能向每个消费者发送 1 个任务。因此,如果消费者的当前作业已经在进行中,那么我应该移至集合中的下一个项目,并将其留到该消费者正在进行的作业完成时。 Concurrent 集合也可以随时从外部添加,如果我们有新类型,我们需要额外的线程。
我想我的问题归结为如何从集合中自定义“Take”,以便我只使用一个属性来获取下一个任务,该属性指定它有一个没有正在进行的工作的消费者.
关于我在这里缺少什么或者我是否走在正确的道路上的任何想法?
例如,我们有一个中介队列,其中包含与银行交易相关的任务。
所以我们可能会添加到我们的中介队列(假设发送 SummaryData 和 Send TransactionData 使用相同的接口合约来发送数据)
- SendTransactionData -> Bank1
- SendTransactionData -> Bank2
- SendSummaryData -> 仲裁器
- SendTransactionData -> Bank1
- SendTransactionData -> Bank3
- SendTransactionData -> Bank1
- SendTransactionData -> Bank2
1,2,3,5 可以并行处理,但由于他们自己的系统,每个消费者一次只能接受一个输入,事务 4 必须等待事务 1 完成,事务 6 必须等待交易 4 进行处理。同样,事务 7 必须等待事务 2。
在任何初始过程完成之前,有人可能会添加另一个分组。
-
SendSummaryData -> 仲裁器
-
SendTransactionData -> Bank1
-
SendTransactionData -> Bank4
如果有线程可用,可以立即提取 10 个,但 8 和 9 必须排在其他相关任务之后。
显然会有更好的方法来设计一个系统来实现这一点,但这些本质上是我希望满足的规范。
【问题讨论】:
-
是否有可能在问题中包含如何在实践中使用该机制的实际场景?它打算执行什么样的处理?
-
我肯定会添加这个。我不一定能准确地概述我的具体情况,但我会尝试对其进行概括。
-
让我重新表述您的问题。您有一个需要处理的传入对象流,所有这些对象都可以无限并行处理。但是对象也有属性
Bank,相同Bank的对象是不允许并行处理的,需要序列化。这个描述正确吗? -
基本上是的
-
我实际上认为您在此处提到的实现可能正是我正在寻找的。我可能需要考虑信号量 slim 的数量,但我会做一些测试,至少在初始实现时尝试一下,看看会发生什么。
标签: c# .net parallel-processing task-parallel-library