问题标签 [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 回答
1385 浏览

.net - .NET ThreadPool 说明 - 可用线程与空闲线程

我对 .NET ThreadPool 的一个方面有点困惑:即,您如何知道它的“可用”线程中有多少是等待重用的空闲线程,还有多少尚未创建。

GetAvailableThreads()方法的摘要指出:

检索 GetMaxThreads 方法返回的最大线程池线程数与当前活动的线程数之间的差异。

任何“活动”线程都在忙于工作,因此无法重用,但有多少线程“可用”可重用,而“可用”是因为它们尚未创建?

我知道该GetMinThreads()方法返回框架将在池中维护以供重用的绝对最小线程数,但这并不一定等于当前空闲线程的数量 - 是吗?我的印象是,空闲线程会在 ThreadPool 中徘徊,并且只有在它们闲置一段时间后才会被修剪到最低限度。

这很重要,因为根据文档:

当所有线程池线程都已分配给任务时,线程池不会立即开始创建新的空闲线程。为了避免不必要地为线程分配堆栈空间,它会每隔一段时间创建新的空闲线程。该时间间隔目前为半秒,但在 .NET Framework 的未来版本中可能会发生变化。

我想检查我的应用程序是否必须在池中创建过多的“新”线程 - 减慢它的速度 - 但我不确定如何做到这一点,而无法弄清楚有多少空闲,准备就绪-重用我闲逛的线程。

欢迎任何想法。谢谢!

0 投票
12 回答
279357 浏览

multithreading - 多少个线程太多了?

我正在编写一个服务器,并在收到请求时将每个操作发送到一个单独的线程中。我这样做是因为几乎每个请求都会进行数据库查询。我正在使用线程池库来减少线程的构造/销毁。

我的问题是:像这样的 I/O 线程的好的截止点是什么?我知道这只是一个粗略的估计,但我们是在谈论数百个吗?数千?

我将如何弄清楚这个截止点是什么?


编辑:

谢谢大家的回复,看来我只需要对其进行测试以找出我的线程数上限。但问题是:我怎么知道我已经达到了那个天花板?我到底应该测量什么?

0 投票
3 回答
6194 浏览

c# - 如何以某种优先级调用异步方法?

我需要以不同的优先级异步调用几个方法。

我的第一个想法是使用 ThreadPool 并像这样更改 Thread 的优先级:

这行得通还是你有什么建议?

0 投票
11 回答
26248 浏览

c++ - 多线程作业队列管理器

我需要在交互式应用程序中管理占用大量 CPU 的多任务作业。作为背景,我的具体应用是一个工程设计界面。当用户调整模型的不同参数和选项时,会在后台运行多个模拟,并在完成时显示结果,即使用户仍在编辑值也是如此。由于多次模拟需要不同的时间(有些是毫秒,有些需要 5 秒,有些需要 10 分钟),因此基本上是尽快显示反馈的问题,但通常会中止以前开始但现在不再需要的作业,因为用户的更改已经使它们无效。不同的用户更改可能会使不同的计算无效,因此在任何时候我都可能运行 10 个不同的模拟。

我非常有信心处理这种应用程序的代码级方法是某种多线程作业队列。这将包括提交作业以执行、设置任务优先级、等待作业完成、指定依赖关系(执行此作业,但仅在作业 X 和作业 Y 完成后)、取消符合某些条件的作业子集、查询什么作业保留,设置工作线程计数和优先级,等等。多平台支持也非常有用。

这些不是软件中的新想法或新愿望,但我正处于应用程序的早期设计阶段,我需要选择使用哪个库来管理此类任务。我过去用 C 编写了自己的粗略线程管理器(我认为这是一种通过仪式),但我想使用现代工具来作为我工作的基础,而不是我自己以前的 hack。

第一个想法是运行到OpenMP,但我不确定这是我想要的。OpenMP 非常适合精细并行化、自动展开循环等。虽然是多平台的,但它也会使用#pragmas 侵入您的代码。但大多数情况下,它不是为管理大型任务而设计的。尤其是取消挂起的作业或指定依赖项。可能,是的,但它并不优雅。

我注意到即使是最琐碎的任务,谷歌浏览器也会使用这样的作业管理器。设计目标似乎是使用户交互线程尽可能轻巧灵活,因此任何可以异步生成的东西都应该是。从 Chrome 源代码来看,这似乎不是一个通用库,但看看设计如何使用异步启动来保持快速交互仍然很有趣。这越来越类似于我正在做的事情。

还有其他选择:

Surge.Act:用于定义工作的类似 Boost 的库。它建立在 OpenMP 之上,但确实允许链接依赖项,这很好。似乎没有可以查询的经理,可以取消工作等。这是一个陈旧的项目,因此依赖它很可怕。

Job Queue与我的想法非常接近,但这是一篇 5 年前的文章,而不是受支持的库。

Boost.threads确实有很好的平台独立同步,但这不是一个作业管理器。POCO具有非常简洁的任务启动设计,但同样不是用于链接任务的完整管理器。(也许我低估了 POCO)。

因此,虽然有可用的选项,但我并不满意,我有再次推出自己的图书馆的冲动。但我宁愿使用已经存在的东西。即使在搜索之后(在 SO 和网络上),我也没有找到任何感觉正确的东西,尽管我认为这一定是一种经常需要的工具,所以肯定有一些社区库或至少是通用设计。在 SO 上有一些关于工作队列的帖子,但似乎没有什么合适的。

我在这里的帖子是问你们我错过了哪些现有工具,和/或你们是如何推出自己的多线程作业队列的。

0 投票
3 回答
1285 浏览

c# - 如何安全地使用 WaitHandles 来防止死锁?

观察以下伪:

如果在其中一个池线程中发生异常,我的 ASP.NET WebApp 就会死锁。响应流上没有传递异常信息。我正在寻求建议以防止这种情况发生。固定超时是可以接受的。假设 timeConsumingOpHandler Set()s 是 WaitHandle。

整个 timeConsumingOpHandler 被包装在一个 try-catch-finally 块中,在 finally 部分中 WaitHandle 是 Set()。尽管如此,还是会发生死锁。

0 投票
1 回答
482 浏览

c# - 可以为线程池重用标准线程吗?

我在一个令我困惑的应用程序中有一些奇怪的行为。

我创建了一个线程,我们称之为worker,负责处理通信请求。客户端在管道上写入,而线程使用请求并发送消息。

现在,线程的主循环是这样的:

现在回调需要访问client_id(它比我写的要复杂一点,但问题是回调接收到object_id,假设BeginSend是一个调用UdpClient.BeginSend

锁在那里是因为回调可能会触发得如此之快以至于它实际上发生在clientsObjects[object_id] = client_id;可以执行之前......

好的,现在..问题是它不工作,它时不时工作......为什么?如果我跟踪正在执行 BeginSend 的线程和正在执行回调的线程的 ManagedThreadId,我发现有时它们具有相同的 ThreadId!

那可能吗?怎么会这样?关于我做错了什么的任何建议?

评论:实际代码并不完全一样,Transport 是 UDPClient 的包装器,它允许轻松更改传输层,锁不是真正的锁而是自旋锁......但概念本身或多或少是我写下来的.

0 投票
4 回答
8491 浏览

java - 高请求场景下的 Java Threadpool vs. new Thread

我有一些用于 REST 服务的旧 Java 代码,它为每个传入请求使用单独的线程。即主循环将在 socket.accept() 上循环并将套接字移交给一个 Runnable,然后它将启动它自己的后台线程并在其自身上调用 run。这在一段时间内工作得非常好,直到最近我注意到在高负载下接受处理请求的延迟将变得不可接受。当我说得非常好时,我的意思是它每秒处理 100-200 个请求而没有显着的 CPU 使用率。只有当其他守护进程也增加负载并且只有一次负载超过 5 时,性能才会下降。当机器处于来自其他进程组合的高负载(5-8)时,从接受到处理的时间会变得非常长( 500 毫秒到 3000 毫秒),而实际处理保持在 10 毫秒以下。

已经习惯了 .NET 上的线程池,我认为线程创建是罪魁祸首,我想我会在 java 中应用相同的模式。现在我的 Runnable 使用 ThreadPool.Executor 执行(并且池使用和 ArrayBlockingQueue)。同样,它在大多数情况下都非常有效,除非机器负载变高,然后从创建可运行对象到调用 run() 的时间显示出同样荒谬的时间。但更糟糕的是,在线程池逻辑到位的情况下,系统负载几乎翻了一番(10-16)。所以现在我在双倍负载下遇到了同样的延迟问题。

我的怀疑是队列的锁竞争比之前没有锁的新线程启动成本更糟糕。任何人都可以分享他们对新线程与线程池的经验。如果我的怀疑是正确的,那么任何人都有另一种方法来处理没有锁争用的线程池?

我很想将整个系统设为单线程,因为我不知道我的线程有多大帮助,而且 IO 似乎不是问题,但我确实收到了一些长期存在的请求,然后阻止一切。

谢谢,阿恩

更新:我切换到Executors.newFixedThreadPool(100);它,虽然它保持相同的处理能力,但负载几乎立即翻了一番,运行 12 小时显示负载始终保持在 2 倍。我想在我的情况下,每个请求一个新线程更便宜。

0 投票
4 回答
1621 浏览

java - Java 线程教程类型问题

当谈到 Java 线程和并发的世界时,我相当天真。我目前正在努力学习。我做了一个简单的例子来试图弄清楚并发是如何工作的。

这是我的代码:

我需要做什么才能使代码按顺序打印出数字 0-99?

0 投票
3 回答
4333 浏览

c# - 线程池线程的异常

有关的:


如果某个方法抛出了由 ThreadPool.QueueUserWorkItem 方法调用的异常,该异常将在哪里抛出?还是只会被吃掉?

我的意思是它永远不会被扔到调用线程上,对吗?


0 投票
2 回答
4562 浏览

java - 调度程序使用线程池和优先级队列?

我将使用 Java 中的线程池和优先级队列实现一个调度程序,我想问是否有人知道任何现有的实现,所以我没有花时间在它上面:-)...

基本上,java.util.concurrent 包中的 ScheduledThreadPoolExecutor 提供了我需要的几乎所有功能,除了“优先队列”。当我粗略检查了内置的 java 库时,我找不到任何支持在将元素放入队列后从外部修改和更新元素的“优先级”值的优先级队列。

我需要在喜欢下载者的项目中使用这种优先级队列。我想允许用户即时修改每个下载的优先级,并且它在队列中的位置会自动更新。PriorityQueue 不是以这种方式实现的,为了获得正确的优先级,每次我们更改其优先级值时,我们都必须将其删除并再次提交...

以前有人做过这个吗?