2011-12-04 66 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