谈到一个现实世界的例子,有几个理由使用多线程,和我不会聘请不了解它的网络开发人员。但最终,使用多线程的原因与标准和网络开发相同:您要么需要在后台完成一段时间(也就是阻止),以便在用户之间给予用户某种响应,要么您有一项任务可以通过在多个内核上运行来加速。当多线程实际上有用时,却是一个不同的问题。
情况1:即确实需要一些处理并且具有低的命中Web服务器/第二
这里多线程(如果适用于算法)是好事,因为空闲内核被利用和线程可以导致对用户的更快响应。
情况2:那确实需要一些处理,具有较高的命中Web服务器/秒
这里多线程是可能的,但核心是平时忙于其他请求,不存在资源留下来正确使用它。事实上,将任务分散到多个线程中甚至可能对响应时间产生负面影响,因为任务现在已经碎片化并且所有部分都需要完成,但线程的执行顺序未定义。因此,一个客户端可以立即收到响应,而其他客户可能会等待超时,直到最后一个分段最终得到处理。
情况3: Web服务器必须做一些处理,需要一个很长的时间,需要
这里多线程,有没有办法解决它。客户不能等待几分钟或者几个小时,直到收到响应。在这种情况下,通常会执行回调系统,因此基本上每个任务都有一个可以查询当前状态的“API”。大多数网上商店都是这样的例子:您订购了一些东西,稍后您可以查询您的订单状态。
线程的替代方法是过程分支,就像Apache在其标准配置中那样。好处是负载分布在核心之间(主要适用于情况2),并且Web代码本身不必为使用所有核心而做任何事情,因为OS会自动处理这些核心。但是,如果负载不平衡,则某些内核可能处于空闲状态,并且不会以最佳方式使用资源。线程情况几乎总是更好的解决方案,如果它是正确的话。但是Apache/Tomcat标准配置使用非常过时的线程模型,为每个请求产生一个线程。有效地给予一定的点击次数/秒,CPU比线程更忙于实际处理这些请求。
恕我直言,你绝对正确的认为,多线程在web应用中的主要作用是同时处理多个独立的请求,从而使服务器响应。 – Ingo
举个例子说,你有一个用户注册页面,你需要发送该用户关于注册的电子邮件通知。在这种情况下,我们可以通过在单独线程中发送电子邮件来使用多线程。 – Foolish
我正在使用多线程来解析xmls –