我有两种方法(在C#中):
List<Pizza> CookPizza(List<Order>);
List<HappyCustomers> DeliverPizza(List<Pizza>);
Run Code Online (Sandbox Code Playgroud)
这些操作没有共同的对象(除了从一个传递到另一个的比萨),并且是线程安全的.它们每个都需要几秒钟才能执行,它们每个都使用不同的资源(烤箱与汽车).因此,我想同时运行它们.
如何使用这些约束组织线程:
我知道一开始的所有订单(比方说,我有10万个订单).一个订单可以包含多个比萨饼,我不知道在比萨饼煮熟之前,任何订单中都有多少比萨饼.(我知道很奇怪).一般来说,订单有1个披萨,但最多可以有10个.
活跃的比萨饼的数量一般不应超过100.这包括新鲜煮熟的比萨饼和交付的比萨饼.这是一个软限制,所以我可以超过一些(例如,当一个大订单煮熟时).硬限制可能接近500.
当他们获得大量工作时,这两项操作都会更有效率.通常,CookPizza在给出至少20个订单时效率最高.如果给予至少50个比萨饼,提供比萨饼是最有效的.也就是说,如果我给这些方法的项目少于那些数量,我会看到性能下降.如果剩下这些,那么使用更少的物品就可以了.
我正在解决的主要问题是这些方法可能需要相互等待.
我首先使用基于事件的模型来解决这个问题。
假设我们有一个PizzaDispatcher接受命令的对象。调度员CookPizza从初始空状态开始调用一定数量的订单。当披萨煮熟时,该CookPizza函数会通知调度程序披萨已煮熟(可能通过您作为参数提供的回调)。当披萨送达时,该DeliverPizza函数会执行相同的操作。
现在,他们PizzaDispatcher将有足够的信息来根据煮熟的比萨饼和未交付的比萨饼的数量来决定何时以及应上交多少比萨饼进行烹饪或交付。
这可以重构为使用事件而不是回调等,但我发布它是为了这个想法,而不是实现的细节。
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |