Questions tagged «threadpool»

将资源集中到给定的限制中,并自动将任务分配给开放工作人员。

9
如果我的界面必须返回Task,那么执行无操作实现的最佳方法是什么?
在下面的代码中,由于接口的原因,该类LazyBar必须从其方法中返回一个任务(出于参数的考虑,不能更改)。如果LazyBars实现不寻常,因为它恰巧可以快速且同步地运行,那么从该方法返回No-Operation任务的最佳方法是什么? 我已经跟Task.Delay(0)下面,但是我想知道这是否有任何性能的副作用,如果该功能被称为很多(为了讨论各种情形,说上百次),: 这种语法糖是否会发展成大事? 它会开始阻塞我的应用程序的线程池吗? 编译器切割器是否足以应付Delay(0)不同要求? 请问return Task.Run(() => { });有什么不同? 有没有更好的办法? using System.Threading.Tasks; namespace MyAsyncTest { internal interface IFooFace { Task WillBeLongRunningAsyncInTheMajorityOfImplementations(); } /// <summary> /// An implementation, that unlike most cases, will not have a long-running /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations' /// </summary> internal class LazyBar : IFooFace { #region …

12
多少线程太多?
我正在编写服务器,并且在收到请求时将每个动作发送到一个单独的线程中。我这样做是因为几乎每个请求都会进行数据库查询。我正在使用线程池库来减少线程的构造/销毁。 我的问题是:这样的I / O线程的最佳切入点是什么?我知道这只是一个粗略的估计,但是我们正在讨论数百个吗?几千 我将如何确定这个临界值? 编辑: 谢谢大家的答复,看来我只是必须对其进行测试才能确定我的线程数上限。但问题是:我怎么知道我已经达到那个上限了?我到底应该测量什么?

17
命名ExecutorService的线程和线程池
假设我有一个利用该Executor框架的应用程序 Executors.newSingleThreadExecutor().submit(new Runnable(){ @Override public void run(){ // do stuff } } 当我在调试器中运行此应用程序时,将使用以下(默认)名称创建线程:Thread[pool-1-thread-1]。如您所见,这并不是非常有用,而且据我所知,该Executor框架没有提供一种简便的方法来命名已创建的线程或线程池。 那么,如何为线程/线程池提供名称呢?例如,Thread[FooPool-FooThread]。

14
ExecutorService,如何等待所有任务完成
等待所有任务ExecutorService完成的最简单方法是什么?我的任务主要是计算,因此我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: ExecutorService es = Executors.newFixedThreadPool(2); for (DataTable singleTable : uniquePhrases) { es.execute(new ComputeDTask(singleTable)); } try{ es.wait(); } catch (InterruptedException e){ e.printStackTrace(); } ComputeDTask实现可运行。这似乎是正确执行的任务,但代码崩溃上wait()用IllegalMonitorStateException。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 uniquePhrases包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西

11
线程与线程池
使用新线程和使用线程池中的线程有什么区别?有哪些性能优势?为什么我应该考虑使用池中的一个线程而不是我明确创建的线程?我在这里专门考虑.NET,但一般示例都可以。

6
如何从线程池获取线程ID?
我有一个固定的线程池,我可以将任务提交给该线程池(限制为5个线程)。我如何找出这5个线程中的哪个执行我的任务(例如“ 5个线程中的第3 个线程正在执行此任务”)? ExecutorService taskExecutor = Executors.newFixedThreadPool(5); //in infinite loop: taskExecutor.execute(new MyTask()); .... private class MyTask implements Runnable { public void run() { logger.debug("Thread # XXX is doing this task");//how to get thread id? } }

10
C ++ 11中的线程池
相关问题: 关于C ++ 11: C ++ 11:std :: thread池化了吗? 为了避免昂贵的线程创建,C ++ 11中的async(launch :: async)是否会使线程池过时? 关于Boost: C ++ Boost线程重用线程 boost :: thread并创建它们的池! 我如何获得一个线程池以将任务发送到,而不是一遍又一遍地创建和删除它们?这意味着持久线程无需加入即可重新同步。 我有看起来像这样的代码: namespace { std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } } int main(int argc, char *argv[]) { …

15
什么时候在C#中使用线程池?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 我一直在尝试学习C#中的多线程编程,对于何时使用线程池而不是创建自己的线程,我感到困惑。一本书建议仅将线程池用于小型任务(无论这意味着什么),但我似乎找不到任何真正的准则。在做出此编程决策时,需要考虑哪些因素?

1
为了避免昂贵的线程创建,C ++ 11中的async(launch :: async)是否会使线程池过时?
它与以下问题大致相关:std :: thread是否在C ++ 11中池化?。尽管问题有所不同,但目的是相同的: 问题1:使用自己的(或第三方库)线程池来避免创建昂贵的线程是否仍然有意义? 另一个问题的结论是,您不能依靠std::thread被池化(它可能会也可能不会)。但是,std::async(launch::async)似乎有更高的机会被合并。 它不认为这是标准的强制要求,但是恕我直言,我希望所有好的C ++ 11实现都可以在线程创建缓慢的情况下使用线程池。我希望仅在廉价的平台上创建新线程,我希望它们总是产生新线程。 问题2:这就是我的想法,但我没有事实可以证明。我很可能会误会。这是有根据的猜测吗? 最后,在这里,我提供了一些示例代码,这些代码首先显示了我认为如何通过async(launch::async)以下方式表达线程创建: 范例1: thread t([]{ f(); }); // ... t.join(); 变成 auto future = async(launch::async, []{ f(); }); // ... future.wait(); 示例2:触发并忘记线程 thread([]{ f(); }).detach(); 变成 // a bit clumsy... auto dummy = async(launch::async, []{ f(); }); // ... but …

11
在高流量情况下在ASP.NET中使用ThreadPool.QueueUserWorkItem
我一直给人的印象是,即使在ASP.NET中,也将ThreadPool用于(例如,非关键的)短期后台任务被认为是最佳实践,但随后我发现这篇文章似乎暗示了其他方面-争论是您应该离开ThreadPool来处理与ASP.NET相关的请求。 因此,到目前为止,这是我一直在执行小型异步任务的方式: ThreadPool.QueueUserWorkItem(s => PostLog(logEvent)) 而文章的建议,而不是明确地创建一个线程,类似于: new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start() 第一种方法具有受管理和限制的优点,但有可能(如果本文是正确的)后台任务然后争用ASP.NET请求处理程序争用线程。第二种方法释放了ThreadPool,但代价是不受限制,因此有可能消耗太多资源。 所以我的问题是,文章中的建议正确吗? 如果您的网站流量太多,以至于ThreadPool变满了,那么最好带外使用,或者完整的ThreadPool暗示您无论如何都会达到资源的极限,在这种情况下,不应该尝试启动自己的线程? 澄清:我只是在询问小型非关键性异步任务(例如,远程日志记录),而不是需要单独流程的昂贵工作项(在这种情况下,我同意您需要一个更强大的解决方案)。

3
FixedThreadPool与CachedThreadPool:两种弊端中的较小者
我有一个程序产生线程(〜5-150)来执行一堆任务。最初,我使用a,FixedThreadPool因为这个类似的问题表明它们更适合寿命更长的任务,并且由于我对多线程的了解非常有限,我认为线程的平均寿命(几分钟)是“ 寿命长 ”的。 但是,我最近添加了产生更多线程的功能,并且这样做使我超出了我设置的线程限制。在这种情况下,最好猜测并增加我可以允许的线程数,或者切换到a CachedThreadPool以便没有浪费的线程? 初步尝试将它们都尝试一下,似乎没有什么区别,所以我倾向于选择CachedThreadPool正义以避免浪费。但是,线程的寿命是否意味着我应该改而选择a FixedThreadPool并只处理未使用的线程?这个问题使得它看起来像那些额外的线程不被浪费,但我希望澄清。

7
Java:ExecutorService在特定队列大小后会在提交时阻止
我正在尝试编写一个解决方案,其中单个线程会产生可并行执行的I / O密集型任务。每个任务都有重要的内存数据。因此,我希望能够限制当前待处理的任务数。 如果我这样创建ThreadPoolExecutor: ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(maxQueue)); 然后,当队列已满并且所有线程都已经繁忙时,executor.submit(callable)抛出该异常RejectedExecutionException。 executor.submit(callable)当队列已满并且所有线程都忙时,我该怎么做才能阻塞? 编辑:我试过了: executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 它以某种微妙的方式达到了我想要达到的效果(基本上被拒绝的线程在调用线程中运行,因此这阻止了调用线程提交更多信息)。 编辑:(问了问题5年后) 对于阅读此问题及其答案的任何人,请勿将接受的答案作为一种正确的解决方案。请通读所有答案和评论。



6
我应该使用ThreadPools还是Task Parallel Library进行IO绑定操作
在我的一个有点像聚合器的项目中,我从网络上解析提要,播客等。 如果我使用顺序方法,那么考虑到大量的资源,要花所有的时间来处理所有这些资源(由于网络问题和类似的东西); foreach(feed in feeds) { read_from_web(feed) parse(feed) } 因此,我想实现并发性,无法决定是否应该基本上使用ThreadPools处理工作线程,还是仅依靠TPL对其进行排序。 ThreadPools肯定会通过辅助线程为我完成工作,并且我会得到期望的结果(在多核CPU环境中,其他内核也将被利用)。 但是我仍然想考虑TPL,因为它是推荐方法,但我对此有些担心。首先,我知道TPL使用ThreadPools,但增加了决策层。我最担心的是存在单核环境的情况。如果我没记错的话,TPL开头的工作线程数等于可用的CPU核心数。我确实担心TPL对于受IO约束的案例会产生与顺序方法相似的结果。 因此,对于IO绑定操作(以我为例,它是从Web上读取资源),最好是使用ThreadPools来控制事物,还是最好仅依赖TPL?TPL也可以用于IO绑定方案吗? 更新:我主要担心的是-在单核CPU环境中,TPL会像顺序方法一样工作还是会提供并发性?我已经在阅读《使用Microsoft .NET进行并行编程》,因此这本书却找不到确切的答案。 注意:这是我以前的问题的重新措辞[可以同时使用线程并发和并行性吗?]这句话是错误的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.