问题标签 [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 投票
2 回答
1066 浏览

c# - 使用 Parallel.For 测试 SQL 查询并与 ThreadPool 进行比较

我正在寻找一种方法来轻松加载测试和基准测试我们的一些 SQL(使用 ADO.NET,使用 LINQ 或 PLINQ 没什么特别的),在高并行负载下运行时必须具有高性能。

我曾考虑使用新的并行扩展 CTP,特别是Parallel.For/Parallel.ForEach简单地运行 SQL 超过 10k 次迭代左右 - 但我无法找到任何关于这些优化的数据。

本质上,我担心因为数据库访问本质上是 I/O 绑定的,所以它不会产生足够的负载。有谁知道并行。如果它正在执行的任务不完全受 CPU 限制,是否足够智能以使用 > x 个线程(其中 x = CPU 数)?即它的行为方式与托管线程池类似吗?

如果是这样就更酷了!

编辑:正如@CVertex 在下面提到的,您可以独立设置线程数。有谁知道默认情况下并行库是否足够智能以在作业受 I/O 绑定时继续添加线程?

0 投票
7 回答
9286 浏览

c# - 当所有后台线程池线程完成时收到通知

当我使用 ThreadPool 启动 3..10 个线程时,我有一个场景。每个线程完成其工作并返回到 ThreadPool。当所有后台线程完成时,在主线程中通知哪些可能的选项?

目前我正在使用一种本土方法,为每个创建的线程增加一个变量,并在后台线程即将完成时减少它。这工作得很好,但我很好奇是否有更好的选择。

0 投票
4 回答
4321 浏览

java - 两个 ExecutorService 可以共享一个线程池吗?

我有一组要处理的记录,并且可以并行处理,所以我创建了一个ExecutorService(通过Executors#newCachedThreadPool())。单个记录的处理本身是由可并行化的步骤组成的,所以我想使用另一个ExecutorService. 有没有一种简单的方法可以让这个新线程使用相同的底层线程池?它甚至是可取的吗?谢谢。

0 投票
2 回答
2856 浏览

threadpool - 自定义线程池中的 IOCP

我目前正在互联网上搜索自定义线程池实现。我找到了一个使用 IOCP 的实现。我想知道使用它们有什么好处?他们是否提供工作窃取或类似的东西,我真的可以找到答案......

0 投票
5 回答
690 浏览

c# - ThreadPool 和 GUI 等待问题

我是线程新手,需要帮助。我有一个数据输入应用程序需要花费大量时间来插入新记录(即 50-75 秒)。所以我的解决方案是通过 ThreadPool 发送一个插入语句,并允许用户在插入运行时开始输入记录的数据,该插入返回一个新的记录 ID。我的问题是用户可以在从该插入返回新 ID 之前点击保存。

我尝试放入一个布尔变量,当可以安全保存时,该变量通过来自该线程的事件设置为 true。然后我输入

我认为这是个坏主意。如果我在胎面返回之前运行保存方法,它就会卡住。

所以我的问题是:

  1. 有没有更好的方法来做到这一点?
  2. 我在这里做错了什么?

谢谢你的帮助。
道格

编辑以获取更多信息:

它正在插入一个非常大(接近最大大小)的 FoxPro 数据库。该文件有大约 200 个字段和几乎一样多的索引。
在你问之前,不,我不能像以前那样改变它的结构,而且有大量的遗留代码在攻击它。第一个问题是,为了获得一个新 ID,我必须首先在表中找到 max(id),然后对其进行递增和校验。这大约需要 45 秒。然后第一个插入很简单,插入新的 id 和一个 enterdate 字段。该表不是/不能放入 DBC 中,因此排除了自动生成的 id 等。

@joshua.ewer
你的过程是正确的,我认为短期内我只会禁用保存按钮,但我会研究你将其传递到队列中的想法。您是否有任何我应该看一看的 MSMQ 参考资料?

0 投票
1 回答
122 浏览

c# - 使用 ThreadPools 搜索对象列表

我在一个列表中有这些容器对象(我们称它们为容器)。这些 Container 对象中的每一个又DataItem在列表中具有一个(或派生类)。在典型场景中,用户将拥有 15-20 个 Container 对象,每个对象有 1000-5000DataItems个。然后有一些DataMatcher对象可用于不同类型的搜索。这些工作大部分都很好(因为我对它们进行了数百个单元测试),但为了让我的 WPF 应用程序感觉敏捷和响应,我决定我应该使用ThreadPool这个任务。因此,我有一个在 Container 对象上运行的DataItemCommandRunner,并且基本上在列表中执行每个委托,它DataItem依次作为每个委托的参数;我用ThreadPool为每个 Container 排队一个线程,这样理论上搜索在多核计算机等上应该尽可能高效。

这基本上是在一个看起来像这样的DataItemUpdater类中完成的:

RunCommandsOnContainer的无用对象参数是因为我正在尝试使用和不使用线程,其中一个需要一些参数。此外,将优先级设置为AboveNormal也只是一个实验。)

这适用于除一种情况外的所有情况 - 当我使用将查找包含所有正在搜索的单词的对象的AllWordsMatcher对象类型时(而不是任何单词,例如确切的短语或正则表达式)。DataItem

这是一个非常简单somestring.Contains(eachWord)的基于对象,由单元测试支持。但这里有一些毛茸茸的奇怪。

RunCommandsOnContainer使用ThreadPool线程运行时,它将返回疯狂的结果。假设我有一个这样的字符串:

我运行这个:

当它运行时,这实际上会返回很多 true - 我有调试信息显示它对于空字符串和其他根本不包含数据的字符串返回 true。此外,即使字符串实际上包含正在查找的数据,它有时也会返回 false。

在这一切的踢球者?为什么我怀疑ThreadPool而不是我自己的代码?

当我为我的主线程中的每个容器运行RunCommandsOnContainer()命令时(即锁定 UI 和所有内容),它可以 100% 正确运行 - 每次!它永远不会找到它不应该找到的任何东西,它永远不会跳过它应该找到的任何东西。

但是,一旦我使用ThreadPool,它就会开始找到很多它不应该找到的项目,而有时却找不到它应该找到的项目。

我意识到这是一个复杂的问题(尝试调试很痛苦,这是肯定的!),但是任何关于为什么以及如何解决这个问题的见解将不胜感激!

谢谢!

符文

0 投票
2 回答
3180 浏览

c# - 检测到 ThreadPool WorkItem 已完成/等待完成

无论出于何种原因,ThreadPool'sQueueWorkItem都不会返回IAsyncResult工作项的句柄或其他句柄,这将允许等待它完成。有一些RegisterWait...方法,但是您必须通过 aWaitHandle并且创建它们很昂贵(请参阅IAsyncResult文档,它建议您延迟创建 aWaitHandle直到请求)。Task Parallel Library 将解决这个缺陷,但在可用之前等待很长时间。那么,这个设计有什么问题吗:

编辑:我问了一个关于使用异步委托而不是 ThreadPool 时出现的问题的后续问题

0 投票
2 回答
88264 浏览

c# - C# 中的简单线程池代码

为简单的线程池实现寻找一些示例代码(C#)。

我在 codeproject 上找到了一个,但代码库非常庞大,我不需要所有这些功能。

无论如何,这更多是出于教育目的。

0 投票
1 回答
6421 浏览

c# - C#、IAsyncResult 和线程池

我用的Action<object>.BeginInvoke()方法,这个是用线程池还是不用线程池?

我有以下 C# 代码:

线程池是否在幕后使用?还是系统创建正常线程?

0 投票
2 回答
47266 浏览

c# - C#线程池限制线程

好吧...我已经对该网站进行了公平的搜索,并阅读了许多有关此主题的帖子。我发现这个问题:Code for a simple thread pool in C#特别有用。

但是,似乎总是如此,我需要的东西略有不同。

我查看了 MSDN 示例并对其进行了一些调整以适应我的需要。我参考的例子在这里:http: //msdn.microsoft.com/en-us/library/3dasc8as (VS.80,printer).aspx

我的问题是这个。HttpWebRequest我有一组相当简单的代码,通过和WebResponse类加载网页并通过Stream. 我在一个线程中触发了这个方法,因为它需要执行很多次。该方法本身很短,但需要触发的次数(每次使用不同的数据)会有所不同。它可以是 1 到 200 之间的任何值。

我读过的所有内容似乎都表明该ThreadPool班级是主要候选人。这就是事情变得棘手的地方。我可能需要启动这个东西说 100 次,但我最多只能运行 3 个线程(对于这个特定任务)。

我试过MaxThreadsThreadPool通孔上设置:

我并不完全相信这种方法是有效的。此外,我不想破坏将在其上运行的系统上运行的其他网站或程序。那么,通过限制 上的线程ThreadPool数,我可以确定这仅与我的代码和我的线程有关吗?

MSDN 示例使用事件驱动方法和调用WaitHandle.WaitAll(doneEvents);,这就是我这样做的方式。

所以我的问题的核心是,如何确保或指定可以为其代码运行的最大线程数,但让代码继续运行更多线程,因为之前的线程完成直到某个任意点?我以正确的方式解决这个问题吗?

真挚地,

杰森


好的,我添加了信号量方法并完全删除了ThreadPool代码。看起来很简单。我的信息来自:http ://www.albahari.com/threading/part2.aspx

正是这个例子向我展示了如何:

[下面的文字是从网站复制/粘贴]

容量为 one 的ASemaphore类似于 a Mutexor lock,只是它Semaphore没有“所有者”——它与线程无关。任何线程都可以调用Releasea Semaphore,而使用Mutexand lock,只有获得资源的线程才能释放它。

在以下示例中,十个线程执行一个循环,Sleep中间有一条语句。ASemaphore确保不超过三个线程可以Sleep一次执行该语句: