2011-12-04 23 views
2

我正在比较任务队列/线程池模式系统和D中的n -threads系统。我对D编程语言非常陌生,但之前曾在C,Java和Python中使用过线程。我正在使用Tango库,并且正在构建一个Web服务器。如何异步添加任务到探戈(D)ThreadPool?

我决定使用tango.core.ThreadPool作为我的线程池,因为我的项目侧重于传统线程和任务队列之间的易用性和性能。

documentation表明,我有3个选项:

  1. ThreadPool.wait() - 阻止当前线程,而池从队列中消耗的任务。
  2. ThreadPool.shutdown() - 完成池中的任务,但不是中的那些队列中的任务。
  3. ThreadPool.finish() - 完成池和队列中的所有任务,但不再接受。

这些都不是我想要的。我的理解是,您的任务列表应该能够在这些系统中发展。网络服务器非常简单而幼稚;我只是希望它尽量扩展到许多并发请求,即使其资源管理只包含尽可能快地消耗任务队列中的内容。

我怀疑这是因为主线程需要连接其他线程,但我对线程知识有点生疏。

+0

为什么不使用D2?它具有好/更好的并行性功能。 –

+0

@Daevius:除此之外,Brian必须向Tango宣誓。 – menjaraz

+0

@Daevius:由于我的开发环境,我被限制在D版本1中;拥有Tango的LDC是唯一可用的装备。 – Brian

回答

0

我发现我构建代理的方式有助于阻止代码的某些部分。我现在将该对象作为参数传递给我的委托,而不是关闭由SocketServer.accept返回的对象。我不知道为什么这是解决方案,但该程序现在按预期工作。我听说D版本1中的闭包被破坏了;也许这与它有关。

0

void append(JobD job, Args args)?从它的工作方式类似于Executor.execute(Runnable)形式的java文件(提交任务要运行在未来的一段时间)

注意,这里是一个后进先出队列,而不是预期的FIFO队列,以便分配足够的工人

+0

我一直在使用append;我想知道如果我做错了什么,因为在Apache基准测试中使用'-c 2'会导致某些事情卡住。我确实看到它是堆栈而不是队列的评论;我想知道他们为什么做出这个决定。 – Brian