【发布时间】:2014-01-02 01:42:42
【问题描述】:
我们编写了使用 ~200 个线程的服务。
200 线程必须做:
1- 从网上下载
2- 解析原始数据(html,xml,json...)
3- 将新创建的数据存入db
对于约 10 个线程,第二次操作(解析)所用时间为 50 毫秒(每个线程)
对于约 50 个线程,第二次操作(解析)所用时间为 80-18000 毫秒(每个线程)
所以我们有一个想法!
我们可以将文档下载为多线程,但使用 MSMQ 我们可以将原始数据发送到另一个进程(消费者)。另一个进程将第二部分(解析)实现为单线程。
您可以说为什么不在同一进程中使用 c# Queue 类。我们无法阻止线程上下文切换中的“宝贵解析线程”。如果同一个进程中有 200 个线程,那么珍贵的将是上下文切换的牺牲品。
这个需求使用MSMQ正常吗?
【问题讨论】:
-
这并不能解决任何问题,这样的进程也会竞争处理器。事实上,它使线程上下文切换变得更加昂贵。您必须将数据发送到完全不同的机器。 MSMQ 对此很有用。尽管网络延迟现在很可能会杀死您。解析是一个整数问题,永远不要创建比处理器内核更多的线程。创造更多,你只会放慢速度。
-
首次测试表明,当我们将步骤分配到不同的流程时,会有一定的改进。我们将发送详细信息。谢谢。
标签: c# multithreading performance msmq