问题标签 [threadpool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4861 浏览

c# - 将单线程应用程序迁移到多线程、并行执行、蒙特卡罗模拟

我的任务是采用现有的单线程蒙特卡罗模拟并对其进行优化。这是 ac# 控制台应用程序,没有 db 访问它从 csv 文件加载数据一次并在最后写出来,所以它几乎只是 CPU 绑定,也只使用大约 50mb 的内存。

我已经通过 Jetbrains dotTrace 分析器运行它。在总执行时间中,大约 30% 用于生成均匀随机数,24% 将均匀随机数转换为正态分布随机数。

基本算法是大量嵌套的 for 循环,以随机数调用和矩阵乘法为中心,每次迭代返回一个双精度数,将其添加到结果列表中,该列表定期排序并测试一些收敛标准(在检查每 5% 的总迭代计数点)如果可以接受,程序会跳出循环并写入结果,否则继续到最后。

我希望开发人员参与进来:

  • 我应该使用新的 Thread v ThreadPool
  • 我应该看看Microsoft Parallels 扩展库吗
  • 我应该看看AForge.Net Parallel.Forhttp://code.google.com/p/aforge/任何其他库吗?

由于我从未编写过任何并行或多线程代码,因此非常欢迎一些指向上述教程的链接

  • 生成大量正态分布随机数的最佳策略,然后使用这些随机数。应用程序永远不会在此状态下使用统一随机数,它们总是被转换为正态分布,然后被消耗掉。
  • 用于随机数生成的良好快速库(并行?)
  • 当我采用这种并行方式时的内存考虑,我需要多少额外的东西。

当前应用程序需要 2 小时进行 500,000 次迭代,业务需要将其扩展到 3,000,000 次迭代并每天调用多次,因此需要进行大量优化。

特别想听听使用过Microsoft Parallels ExtensionAForge.Net Parallel的人的意见

这需要相当快地进行生产,因此.net 4 beta 已经发布,即使我知道它已经内置了并发库,我们可以考虑在它发布后稍后迁移到 .net 4。目前服务器有.Net 2,我已经提交了我的开发盒有的.net 3.5 SP1 的升级以供审查。

谢谢

更新

我刚刚尝试了 Parallel.For 实现,但它产生了一些奇怪的结果。单线程:

到:

在模拟内部有许多对 rnd.nextUniform() 的调用,我想我得到了许多相同的值,这可能会发生,因为这现在是并行的吗?

也可能是 List AddRange 调用不是线程安全的问题?我看到这个

System.Threading.Collections.BlockingCollection 可能值得使用,但它只有一个 Add 方法,没有 AddRange 所以我必须查看那里的结果并以线程安全的方式添加。非常感谢使用 Parallel.For 的人的任何见解。我暂时切换到System.Random进行调用,因为我在使用 Mersenne Twister 实现调用 nextUniform 时遇到异常,也许它不是线程安全的,某个数组的索引越界......

0 投票
2 回答
644 浏览

networking - 网络绑定任务的线程池大小

确定包含以下任务的线程池大小的基本规则是什么:

  • 始终是网络绑定的;
  • 以不同的吞吐量和延迟访问外部服务。

我主要关心的是优化使用带宽(不要连续处理任务,但也不要打开 1200 个网络连接);

0 投票
4 回答
2328 浏览

c# - Java 中自适应线程池的设计注意事项

我想用 Java 实现一个线程池,它可以根据提交给它的任务的计算和 I/O 行为动态调整自身大小。

实际上,我想实现与C# 4.0 中的新线程池实现相同的行为

是否已经有实现,或者我可以通过使用大多数现有的并发实用程序(例如 CachedThreadPool)来实现此行为?

C# 版本进行自我检测以实现最佳利用率。Java 中有哪些可用的自我检测工具,目前对性能有何影响?

执行协作方法是否可行,其中任务表明其意图(例如进入 I/O 密集型操作,进入 CPU 密集型操作阶段)?

欢迎任何建议。

编辑基于评论:

目标场景可能是:

  • 本地文件抓取与处理
  • 网络爬取
  • 多Web服务访问和聚合

CachedThreadPool 的问题在于,当所有现有线程都被阻塞时,它会启动新线程——您需要在其上设置显式边界,仅此而已。

例如,我有 100 个 Web 服务要连续访问。如果我创建一个 100 CTP,它将启动 100 个线程来执行操作,并且大量的多个 I/O 请求和数据传输肯定会互相绊倒。对于静态测试用例,我将能够进行试验并找出最佳池大小,但我希望它能够自适应地确定并以某种方式应用。

0 投票
3 回答
719 浏览

c# - ThreadPool 给出了惊人的结果,我做对了吗?(不,我没有)

并不是说我不欣赏多线程ThreadPoolThreadPool. 所以我在这里提交我的代码,让比我聪明得多的人撕毁。

我在这里做错了什么,还是这只是比我希望的多线程更好的候选者?(是的,这个函数是一个完整的线程:就像我说的,这过去需要一分钟才能运行)

编辑:回答我自己的问题,不,这是坏的:它似乎运行了多次,但在同一个触发器上。这是因为 lambda 的处理方式吗?

0 投票
1 回答
298 浏览

.net - .Net 2.0 & SQL Server 2008 挂起进程

我创建了一个简单的 .Net Web 服务,它运行一个非常简单的查询(通常应该很快)。查询是这样的:

V_ActiveDir 是活动目录数据的视图。这个查询本质上是给我一个电子邮件地址列表,报告应该通过电子邮件发送到这些地址。我的报告表目前只有 3 条记录。我试图将字段添加到报告表中,但它需要很长时间,这就是我发现这个查询挂在 sql 进程中的原因。当天早些时候,此脚本生成了以下错误:

...这解释了我认为的悬挂过程。我们试图杀死它,但现在它处于回滚状态,我认为我们可能必须重新启动 sql 服务器(在我看来,选择查询会尝试回滚这很奇怪)。sql server 或 .net 有什么方法可以防止这种情况再次发生吗?或者我可以在 sql 中删除这个进程的一种方法......线程池中是否有可能挂着什么东西?我仍然可以从报告表中进行选择,因此没有表锁定,只有当我尝试更改此表时,它才会旋转它的轮子。

我对 IIS 没有太多经验,因为我无法访问它,但如果有建议,我可以将其传递。

编辑:这可能是因为在我的 catch 语句中我没有检查 SqlConnection 是否打开,以及是否关闭它?

0 投票
3 回答
1326 浏览

c - 什么是线程池?

实现线程池的概念是什么(在 pthreads 的帮助下用 C 语言)?如何分配线程从线程池中执行?

0 投票
2 回答
2385 浏览

delphi - 如何使用 Omni Thread Library 的线程池控制内存使用?

我一直在使用gabr 的 OmniThreadLibrary来构建一个 ThreadPool。

在多线程方面我是个新手,这就是为什么我发现 OTL 如此有趣。

在演示应用程序“app_11_ThreadPool.exe”之后,我在我的应用程序中设置了一个线程池。我的应用程序的目的是获取 URL 列表,并尝试连接到它们并下载自动返回的任何文件(我正在测试潜在的恶意软件站点的有效负载,以便我可以阻止它们)。

通常我会有一个包含 500 - 1000 个站点的列表。我有一个 TMemo 在我的主窗体上保存 URL。这是我的相关代码。请注意,此代码是从我的“开始”按钮单击事件执行的。

这是 TSiteQuery:

现在,一切都很好。运行 1000 个 URL 会将我的应用程序的内存使用量从 10mb 增加到 ~130mb。这没什么大不了的,我明白这一点。

但问题是每次单击“开始”时,应用程序的内存使用量都会增加约 130mb。也许我只是不知道自己在做什么,但我的印象是使用线程池意味着我不必每次运行都创建新线程。

我希望池中先前创建的线程将在后续执行中重用。我期待我的应用程序的内存使用量将保持在 ~130 mb 左右,无论我点击“开始”1 次还是随后 10 次。

有什么建议么?

问候

0 投票
2 回答
5378 浏览

c# - C#:启动许多连接时的异步委托与 ThreadPool.QueueUserWorkItem

我必须发送许多 Web 服务调用来删除 Amazon SDB 中的一堆记录(不幸的是,目前只能一次删除一个行)。

我正在使用不使用异步 WebRequests 的 Amazon 的 SDB c# 库。

目前我使用 ThreadPool.QueueUserWorkItem 来排队一堆调用(我配置了我的 connectionManagement maxconnection 以允许一堆连接)这很好用..当请求发出时,它会阻塞并发出另一个请求。

这是实现这一目标的错误方法吗?我应该使用异步委托并执行 BeginInvoke 和 EndInvoke 吗?

0 投票
5 回答
3162 浏览

c# - 如何在 .NET 中创建固定大小的线程池?

我想在 .NET 中创建一个固定的任意大小的 ThreadPool - 我知道默认大小是 25 - 但我希望有一个不同的大小,例如 5 或 10。有人吗?

0 投票
11 回答
41664 浏览

asp.net - 在高流量场景中使用 ASP.NET 中的 ThreadPool.QueueUserWorkItem

我一直认为将 ThreadPool 用于(假设是非关键的)短期后台任务被认为是最佳实践,即使在 ASP.NET 中也是如此,但后来我发现这篇文章似乎暗示了其他情况——论点是您应该离开 ThreadPool 来处理与 ASP.NET 相关的请求。

所以到目前为止,我一直在执行小型异步任务:

文章建议改为显式创建一个线程,类似于:

第一种方法具有被管理和有界的优势,但有可能(如果文章正确的话)后台任务会与 ASP.NET 请求处理程序竞争线程。第二种方法释放了 ThreadPool,但代价是不受限制,因此可能会占用太多资源。

所以我的问题是,文章中的建议是否正确?

如果您的网站获得如此多的流量以至于您的 ThreadPool 已满,那么最好是带外使用,或者完整的 ThreadPool 是否意味着您已经达到资源的极限,在这种情况下您不应该尝试开始自己的线程吗?

澄清:我只是在小型非关键异步任务(例如,远程日志记录)的范围内询问,而不是需要单独进程的昂贵工作项(在这些情况下,我同意您需要更强大的解决方案)。