Tag:

我应该使用ThreadPools或任务并行库进行IO绑定操作

在我的一个项目中,这是一个聚合器,我从网上parsing源,播客等等。 如果我使用顺序方法,考虑到大量资源,处理所有资源需要相当长的时间(由于networking问题和类似的东西); foreach(feed in feeds) { read_from_web(feed) parse(feed) } 所以我想要实现并发性,并不能决定是否应该基本上使用ThreadPools来处理工作线程或只是依靠TPL来进行sorting。 ThreadPools肯定会用工作线程来处理我的工作,我会得到我所期望的(在多核CPU环境下,其他核心也将被使用)。 但是我仍然想考虑TPL,因为它是推荐方法,但我有点担心。 首先我知道TPL使用ThreadPools,但增加了额外的决策层。 我主要关心的是单核环境存在的情况。 如果我没有错,TPL从一开始就有一个数字的工作线程开始,等于可用CPU内核的数量。 我害怕TPL在序列方法上产生类似的结果,这是我的IO界限的情况。 所以对于IO绑定的操作(在我的情况下,从网上读取资源),是最好使用ThreadPools和控制的东西,或者更好的只是依靠TPL? TPL也可以用于IO界限的情况吗? 更新 :我主要关心的是 – 在单核CPU环境下,TPL只是performance得像顺序方法,还是会提供并发性? 我已经阅读了与Microsoft .NET并行编程,所以这本书,但无法find一个确切的答案。 注意:这是我以前的问题的重新措辞[ 是否可以一起使用线程并发和并行? ]这是错误的措词。

C ++ 11中的async(launch :: async)是否会使线程池过时,以避免代价高昂的线程创build?

它与这个问题松散地相关: std :: thread是在C ++ 11中汇集的吗? 。 虽然问题不同,但意图是一样的: 问题1:使用自己的(或第三方库)线程池以避免代价高昂的线程创build仍然有意义吗? 在另一个问题的结论是,你不能依靠std::thread汇集(它可能或可能不)。 然而, std::async(launch::async)似乎有更高的机会被汇集。 它不认为这是由标准强制的,但恕我直言,我希望所有好的C ++ 11实现将使用线程池,如果线程创build速度慢。 只有在创build新线程便宜的平台上,我才会期望它们总是产生一个新的线程。 问题2:这只是我的想法,但我没有事实可以certificate。 我很可能是错的。 这是一个受过教育的猜测吗? 最后,在这里,我提供了一些示例代码,首先显示了我认为线程创build可以通过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(); […]

在高stream量情况下在ASP.NET中使用ThreadPool.QueueUserWorkItem

我一直认为使用ThreadPool(假设非关键)短命的后台任务被认为是最好的实践,即使在ASP.NET中,但是我接触到了这篇文章 ,似乎有其他的build议 -参数是你应该离开ThreadPool来处理ASP.NET相关的请求。 所以下面是我迄今为止一直在做的小型asynchronous任务: ThreadPool.QueueUserWorkItem(s => PostLog(logEvent)) 而文章build议,而不是明确创build一个线程,类似于: new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start() 第一种方法具有被pipe理和限制的优点,但是有潜力(如果文章是正确的话)后台任务正在争夺具有ASP.NET请求处理程序的线程。 第二种方法释放了ThreadPool,但代价是没有限制,因此可能会占用太多的资源。 所以我的问题是,文章中的build议是否正确? 如果您的网站stream量太大,以至于您的ThreadPool已经满了,那么最好还是带外,或者一个完整的ThreadPool意味着无论如何您都会受到资源的限制,在这种情况下,您不应该试图开始自己的线程? 澄清:我只是在小的非关键asynchronous任务(例如,远程日志logging)范围内请求,而不是昂贵的工作项目,这将需要一个单独的过程(在这种情况下,我同意你将需要一个更强大的解决scheme)。

什么时候在C#中使用线程池?

我一直在尝试学习C#中的multithreading编程,我很困惑什么时候最好使用线程池,创build自己的线程。 一本书build议使用一个线程池只用于小任务(不pipe这意味着什么),但我似乎无法find任何真正的指导方针。 在做出这个编程决定时,你需要考虑什么?

C#对象池模式的实现

有没有人有一个很好的资源实施共享对象池战略的有限资源的Sql连接池? (即完全实现它是线程安全的)。 为了跟进@Aaronaught的澄清要求,池的使用将是负载平衡请求到外部服务。 把它放在一个可能更容易立即理解的场景中,而不是我的直接情景。 我有一个会话对象,其function类似于NHibernate的ISession对象。 每个独特的会话pipe理它连接到数据库。 目前我有1长时间运行的会话对象,并遇到问题,我的服务提供商是速率限制我个人会话的使用。 由于他们没有期望将一个会话视为一个长期运行的服务帐户,他们显然把它视为一个锤击他们的服务的客户端。 这使我想到我的问题,而不是有一个单独的会话,我会创build一个不同的会话池,并跨越这些多个会话将请求分离到服务,而不是像我以前那样创build一个焦点。 希望背景提供一些价值,但直接回答你的一些问题: 问:创build对象是否昂贵? 答:没有对象是一个有限的资源池 问:他们会被频繁获得/释放吗? 答:是的,他们可以再次想到NHibernate的ISessions,其中1通常是在每个页面请求期间获取和发布的。 问:简单的先到先得的服务是否足够,还是需要更聪明的东西,即能够防止饥饿? 答:一个简单的循环型分布就足够了,通过饥饿我假设你是指如果没有可用的会话,呼叫者被阻止等待发布。 这是不适用的,因为会话可以由不同的呼叫者共享。 我的目标是分配使用跨多个会话,而不是一个单一的会议。 我认为这可能与对象池的正常使用有所分歧,这就是为什么我最初离开这个部分并计划只是为了适应模式,允许共享对象,而不是让饥饿的情况发生。 问:关于优先级,懒惰与急切加载等事情呢? 答:不涉及优先级,为了简单起见,假设我将在创build池本身时创build可用对象池。

ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

下面有什么区别 ThreadPool.QueueUserWorkItem VS Task.Factory.StartNew 如果上面的代码被称为500次的一些长时间运行的任务是否意味着所有的线程池线程将被占用? 或者TPL(第二选项)是否足够聪明,可以占用less于或等于处理器数量的线程?

string跨翻译单位的文字地址

我想问问是否可移植性依赖跨翻译单位的string文字地址? 即: 一个给定的文件foo.c引用了一个string文字"I'm a literal!" ,它是正确的和可移植的依赖在其他给定的文件, bar.c在实例, 相同的string文字 "I'm a literal!" 会有相同的内存地址 ? 考虑到每个文件将被翻译成个人.o文件。 为了更好地说明,请遵循一个示例代码: # File foo.c /* … */ const char * x = "I'm a literal!" # File bar.c /* … */ const char * y = "I'm a literal!" # File test.c /* … */ extern const char * x; extern […]

我可以在由Pool.imap调用的函数中使用多处理队列吗?

我正在使用Python 2.7,并尝试在自己的进程中运行一些CPU繁重的任务。 我希望能够发送消息回到父进程,以通知进程的当前状态。 多处理队列似乎是完美的,但我不知道如何得到它的工作。 所以,这是我的基本工作示例,减去使用队列。 import multiprocessing as mp import time def f(x): return x*x def main(): pool = mp.Pool() results = pool.imap_unordered(f, range(1, 6)) time.sleep(1) print str(results.next()) pool.close() pool.join() if __name__ == '__main__': main() 我试过用几种方式传递队列,并且他们得到错误消息“RuntimeError:队列对象应该只通过inheritance在进程间共享”。 这是我根据我发现的早期答案尝试的方法之一。 (我遇到同样的问题,试图使用Pool.map_async和Pool.imap) import multiprocessing as mp import time def f(args): x = args[0] q = args[1] q.put(str(x)) time.sleep(0.1) return […]

C#中一个简单的线程池的代码

寻找一些简单的线程池实现的示例代码(C#)。 我在codeproject上find了一个,但代码库只是巨大的,我不需要所有的function。 无论如何,这是更多的教育目的。

如何在Python多处理中将Pool.map和Array(共享内存)结合起来?

我有一个非常大的(只读)数据数组,我想要由多个进程并行处理。 我喜欢Pool.map函数,并希望使用它来并行计算该数据上的函数。 我看到可以使用Value或Array类在进程之间使用共享内存数据。 但是当我尝试使用这个时,我得到了一个RuntimeError:'SynchronizedString对象应该只在使用Pool.map函数时通过inheritance在进程之间共享: 这是我正在尝试做的一个简单的例子: from sys import stdin from multiprocessing import Pool, Array def count_it( arr, key ): count = 0 for c in arr: if c == key: count += 1 return count if __name__ == '__main__': testData = "abcabcs bsdfsdf gdfg dffdgdfg sdfsdfsd sdfdsfsdf" # want to share it using shared memory […]