2012-06-16 34 views
1

我有許多任務需要一次執行。正常的解決方案是線程池。但是,我的任務需要只有特定線程才具有的資源。所以我不能把任務放到任何舊線程中;線程必須擁有任務所需的資源。工作人員池中某些任務只能由特定工作人員完成

似乎應該有一個併發模式,但我似乎無法找到它。我在Python 2中用多處理來實現它,所以用這些術語答案會很好,但是通用的解決方案很好。在我的情況下,「線程」實際上是獨立的操作系統進程,資源是網絡連接(並且不,它不是服務器,因此(e)輪詢/選擇不會有幫助)。一般來說,線程/進程可以容納多個資源。

這是一個天真的解決方案:把任務放在工作隊列中,並把線程池放在它上面。讓每個線程檢查「我可以執行此任務嗎?」如果是的話,就這樣做;如果不是,則將其放回隊列中。但是,如果每個任務只能通過N個線程中的一個來完成,那麼我花費了大約2N的時間,浪費了對共享隊列的訪問,只是爲了獲得一個工作單元。

這是我目前的想法:爲每個資源都有一個共享工作隊列。將任務排除在匹配隊列之外。每個線程檢查它可以處理的隊列。

想法?

+0

我冒着改變標題的自由;正如你所說,你的線程實際上不是線程,所以更一般的東西似乎是適當的。對於線程和進程來說,解決方案可能基本上是一樣的,但是有一個心理加速器(至少對我來說是這樣)提出有關線程的問題,然後發現它不是線程。您可能希望稍微重新提一下該問題,以使其更加平滑。 –

+0

我認爲你的每個資源隊列的想法是好的。工作人員需要檢查多個隊列,這意味着他們不能使用阻塞讀取,並且必須在這些隊列(實際上是資源)上具有優先順序。 –

回答

0

一個常見的方法是不分配資源給線程,並將適當的資源排入數據中,但是我明白,如果資源綁定到特定的線程,這並不總是可行的。

每個資源使用隊列的思路只有線程從包含它可以處理的對象的隊列中彈出對象可能會有效。

可能使用信號量+ concurrentQueue數組,通過資源索引來發信號通知這些線程,並且還提供了一個優先級系統,因此消除了大部分輪詢和浪費的請求。我將不得不考慮更多一點 - 這取決於資源如何映射到線程。