2011-05-25 99 views
1

我試圖設計一個天青工人角色例程。工作角色輪詢作業隊列。對於每個作業,在作業消息中指定所需的線程數。作業正在運行可執行文件的實例。例如:可執行文件的名稱是Rax.exe。 Rax.exe可以在不同數量的線程上運行。如果我們將其稱爲Rax.exe -T 2,它將創建兩個線程。所以我們不必處理如何創建線程。我們只需用適當的命令行參數調用Rax.exe即可。我有超大型工作者實例。所以,我可以同時運行8個線程。我想盡可能地利用工人。我們可能有很多作業,每個作業都有不同數量的指定線程。Azure Worker角色設計

實施例:

Job Queue: 

1 Rax.exe -T 3 
2 Rax.exe -T 5 
3 Rax.exe -T 1 
4 Rax.exe -T 8 
5 Rax.exe -T 4 

在這個例子中,我們有5個作業。工作人員讀取第一條消息並開始工作。這項工作消耗3個線程。一個工作者可以有8個線程,所以剩下的5個線程可以通過從隊列中運行另一個工作來使用。

目前,我不知道如何在一個輔助角色內運行多個進程。我正在使用進程類的waitForExit方法。可執行文件的每個運行實例都會創建輸出文件,因此我必須收集這些生成的文件。

我的問題:

1 - 我怎樣才能異步啓動多個進程,當他們退出的通知?我仍然在輪詢工作隊列時這麼做。這種工作安排是一個難題嗎?任何人都可以想出一個很好的啓發式嗎?

編輯: 我認爲,估計每個工作所需的運行時間將會有所幫助。這種信息存在。有了這些信息,它能解決嗎?

+0

您能否解釋爲什麼要創建額外的進程而不是使用並行任務API?這聽起來很適合它。 – 2011-05-25 04:15:33

回答

1

1-如何異步啓動多個進程並在退出時得到通知?我仍然在輪詢工作隊列時這麼做。

這的人很簡單 - 而不是使用WaitForExit,您可以訂閱Exited事件

2 - 這是一種工作調度難的問題?任何人都可以想出一個很好的啓發式嗎?

正如Erno在他的評論中所建議的,解決此問題的一個好方法是將問題傳遞給並行任務API。雖然一般的多線程調度算法可能不提供「最優」調度解決方案,但它可以提供非常少的努力的真正好的解決方案 - 並且工作的複雜性,然後有時一般調度算法可以勝過手工解決方案..

如果您有興趣在Azure上的批處理調度方式,那麼它可能是值得考慮的一些在Azure上的地圖,減少型項目:

雖然這些方法主要是有關分發到多臺機器工作時,同一種方法可以適用於分配在同一臺機器上的多個內核之間工作。

0

您應該使用多個工作者角色實例。

這就是在Azure平臺/範例中進行多處理的方式。您可以讓多個角色實例從同一個隊列中抓取項目,這就是系統的設計方式。