- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直认为,即使在 ASP.NET 中,使用 ThreadPool 执行(比方说非关键的)短期后台任务也被认为是最佳实践,但后来我遇到了 this article这似乎表明并非如此 - 论点是您应该让 ThreadPool 来处理 ASP.NET 相关请求。
以下是迄今为止我执行小型异步任务的方式:
ThreadPool.QueueUserWorkItem(s => PostLog(logEvent))
和the article建议改为显式创建线程,类似于:
new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start()
第一种方法具有受管理和有界的优点,但后台任务有可能(如果文章正确的话)与 ASP.NET 请求处理程序争夺线程。第二种方法释放了ThreadPool,但代价是不受限制,因此可能会占用太多资源。
所以我的问题是,文章中的建议正确吗?
如果您的网站流量如此之大,以至于您的线程池已满,那么最好采用带外方式,还是满的线程池意味着您无论如何都已达到资源限制,在在哪种情况下您不应该尝试启动自己的线程?
澄清:我只是在小型非关键异步任务(例如远程日志记录)的范围内询问,而不是需要单独流程的昂贵工作项目(在这些情况下,我同意您需要一个更强大的工具)解决方案)。
最佳答案
这里的其他答案似乎遗漏了最重要的一点:
除非您尝试并行化 CPU 密集型操作以便在低负载站点上更快地完成该操作,否则使用工作线程根本没有意义。
这适用于由 new Thread(...)
创建的自由线程,以及 ThreadPool
中响应 QueueUserWorkItem
的工作线程> 请求。
是的,确实如此,您可以通过对太多工作项进行排队来使 ASP.NET 进程中的 ThreadPool
挨饿。它将阻止 ASP.NET 处理进一步的请求。文章中的信息在这方面是准确的;用于QueueUserWorkItem
的相同线程池也用于服务请求。
但是,如果您实际上排队的工作项足以导致这种饥饿,那么您应该导致线程池饥饿!如果您同时运行数百个 CPU 密集型操作,那么当计算机已经过载时,使用另一个工作线程来处理 ASP.NET 请求有什么好处呢?如果您遇到这种情况,则需要完全重新设计!
大多数时候,我看到或听到有关 ASP.NET 中不恰当使用多线程代码的情况,它并不是为了对 CPU 密集型工作进行排队。它用于对 I/O 密集型工作进行排队。 如果您想要执行 I/O 工作,那么您应该使用 I/O 线程(I/O 完成端口)。
具体来说,您应该使用您正在使用的任何库类支持的异步回调。这些方法总是有非常清晰的标签;它们以 Begin
和 End
一词开头。如 Stream.BeginRead
、Socket.BeginConnect
、WebRequest.BeginGetResponse
等。
这些方法确实使用ThreadPool
,但它们使用IOCP,而IOCP不会干扰 ASP.NET 请求。它们是一种特殊的轻量级线程,可以被来自 I/O 系统的中断信号“唤醒”。在 ASP.NET 应用程序中,通常每个工作线程都有一个 I/O 线程,因此每个请求都可以有一个排队的异步操作。这实际上是数百个异步操作,而没有任何显着的性能下降(假设 I/O 子系统可以跟上)。这远远超出您的需要。
请记住,异步委托(delegate)不会以这种方式工作 - 它们最终会使用工作线程,就像ThreadPool.QueueUserWorkItem
一样。只有 .NET Framework 库类的内置异步方法才能够执行此操作。您可以自己做,但它很复杂,而且有点危险,可能超出了本讨论的范围。
在我看来,这个问题的最佳答案是不要使用ThreadPool
或后台Thread
实例在 ASP.NET 中。它与在 Windows 窗体应用程序中旋转线程完全不同,在 Windows 窗体应用程序中,您这样做是为了保持 UI 响应,而不关心它的效率如何。在 ASP.NET 中,您关心的是吞吐量,无论您是否使用 ThreadPool<,所有这些工作线程上的所有上下文切换都绝对会杀死您的吞吐量
或不。
如果您发现自己在 ASP.NET 中编写线程代码,请考虑是否可以重写它以使用预先存在的异步方法,如果不能,请考虑您是否真的非常真正地根本需要代码在后台线程中运行。在大多数情况下,您可能会增加复杂性而没有任何净 yield 。
关于asp.net - 在高流量场景中使用 ASP.NET 中的 ThreadPool.QueueUserWorkItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1325718/
有没有其他方法可以直接使用 terraform 启用这些规则,而无需在 GCP 中创建单独的防火墙规则,然后将标签附加到计算引擎 目前我正在这样做 resource "google_compu
全民国家安全日活动 免费抽随机话费、流量 微信打开链接进入活动 下拉页面点击【我要抽奖】进去完成两个任务获得两次抽奖机会 可抽2-10元话费以及流量 抽奖非必中 仅限移动用户参与 活动期间内每日
随着人们的紧凑生活,从事互联网行业的人大多都把一天的时间安排的满满的,这用户忙碌的时候,根本无心去关注你的推广,只有抓住了用户零零碎碎的时间对其进行推广,同时他也能打发无聊的时间,这样的效果就非常轻
我建立了一个库来做 IGMP 的东西。现在,愚蠢的是,我的图书馆还进行了存在监控以确保其他人仍然是该组的一部分。 IGMP 在较低级别做完全相同的事情。分开消息,轮询路由器它仍然是同一组的一部分,整个
我经营一个具有广告集成功能的媒体网站。最近,我们发现很多人滥用这一点,通过在上传内容上进行流量交换来获取虚假收入。最流行的可能是使用 HitLeap Viewer 应用程序的 HitLeap。 我很好
上下文: 所以我在 AKS 集群中有一个测试脚本;此脚本使用 Azure Active Directory 中的用户的单点登录功能登录到站点。 测试脚本位于集群 A 中,站点位于集群 B 中。还为集群
是否可以指示 Fiddler 仅显示定向到特定主机名的流量?也就是说Fiddler流量可以针对Host进行过滤吗? 最佳答案 请参阅此屏幕截图。位于屏幕的右上方 关于fiddler - 过滤 Fidd
这个问题在这里已经有了答案: Android 8: Cleartext HTTP traffic not permitted (36 个回答) 2年前关闭。 我正在从事一个项目,但我被困在登录/注册页
我有一个 Android VOIP 应用程序。由于某些网络会阻止 VOIP 流量,因此我想找到一些绕过阻止的方法。我认为 VPN 可以做到这一点,但没有任何 VPN 解决方案可以轻松实现。使用 And
我构建了使用 SignalR 的服务器和客户端代码。该网站运行良好,但我在任何浏览器(chrome、IE、Firefox)中都看不到网络流量。我知道网络流量在那里,因为该网站正在运行。 有没有办法在浏
我实现了一个自制的嗅探器(基于 winpcap),并尝试在浏览 HTTPS 网站(gmail 和 facebook)时使用它来嗅探 TCP 连接上的端口 443,但我的代码无法检测到任何流量。 我研究
是否可以使用 Android 手机收集同一小区内手机的 IMEI 或唯一手机 ID?可能已经有一些 hack 可以使用 osmocom ...我正在寻找的是一个易于工作的解决方案来扫描交通(通过计算汽
此 Android 代码是否是在通话期间测试 http 网络可用性的正确方法,或者它是否排除了应包含的网络,反之亦然: public boolean isOnline() { Telephon
我需要能够加密从 Web 服务器到数据库服务器的 MySQL 流量。我知道如何根据 my.cnf 中的服务器和客户端设置将 MySQL 设置为使用 SSL,但是,这需要使用 PHP 中的 mysql_
我想查看所有传出 USB 的流量,并可能根据内容策略阻止进出 USB 的数据交易。这将如何完成?有什么方法可以在 C# 中实现此目的,还是它更像是 C++ 类型的问题? 最佳答案 您可以使用类似 Cr
我需要捕获进程进行的 TCP 通信。但是,我不能只运行该进程,查找其 PID,然后捕获。我需要获取启动后立即发生的通信。 它显然是通过未知端口(不是 80)向另一个进程发出 JSON 请求,该进程注册
如果我有一个名为 www.testsite.com 的页面,并且我使用 url 中的查询字符串链接到该页面,是否可以以某种方式将相同的查询字符串附加到所有传出链接/流量? 例如,假设我像这样链接到该页
我在我的机器上运行本地 HTTP 代理服务器并执行一些日志记录。我也想记录 SSL 流量。为此,我运行了另一个用 Python 编写的代理服务器,它充当 SSL 服务器,带有我的自签名证书,HTTP
我正在编写一个应该检测 VPN 流量的程序。据我了解这个主题,似乎隧道协议(protocol)的检测就像防火墙规则一样容易,使用它们的专用端口: PPTP: 端口 1723/TCP OpenVPN:端
所以,情况是:我想知道程序将请求发送到什么路径。使用 Wireshark,我只能知道它发送的是 https 请求和相应的域,但不知道路径。 我认为即使不破解程序也可以至少检查出站 https 流量。
我是一名优秀的程序员,十分优秀!