2012-05-01 46 views
2

讓我們想象一組數據源,即一對熱傳感器或攝像機。我想從這些來源收集從屬數據並傳遞給主數據。使用多個進程/線程/任務從多個來源收集數據

效率是操作的關鍵方面。

我應該使用多個進程或線程/任務嗎?

編輯:我忘了提...所有的數據源應該是同步服務,具有相同的優先級同樣,在同一時間,無論是CPU和內存使用率和內核的可用數量。

回答

1

如果您從多個從站傳遞給主站,請使用線程。這將幫助您分享您的地址空間,並可能使任務更容易實施。如果你有很多奴隸並且想要最高的效率,那麼使用一個線程池來服務奴隸來源。

使用多個進程只會增加進程上下文切換開銷,通常略高於線程上下文切換開銷。您還必須管理進程間通信,這通常比線程間通信更復雜且效率更低。

+0

實際上,多線程的概念更容易處理。我考慮了內存映射文件來交換數據。它可以與進程間通信一起工作。我不知道它是否適合線程。你對此有何看法? – venedie

+1

文件映射對象很可能是您進行高效進程間通信的最佳選擇,您應該避免這種情況。它比線程間通信效率低的原因之一是你必須使用一個互斥體來同步文件映射對象,而不是更有效的關鍵部分。 –

1

這樣做的典型方法是使用讀寫器鎖(.NET中的ReaderWriterLockSlim)。你的作者會一次一個地寫訪問你的共享狀態地圖,而你的讀者(你的客戶端應用程序)可以同時讀取,但顯然不是在生產者正在編寫狀態的時候。

編輯:這顯然是使用線程。進程間的溝通會殺死你可能擁有的體面表現的任何希望。

+0

感謝您的輸入!你能看到評論:http://stackoverflow.com/questions/10402469/collecting-data-from-multiple-sources-using-multiple-processes-threads-tasks#comment13418611_10402490 – venedie

+1

不完全改變很多,你只是有一系列事件是你爲每個生產者發起的,而你的消費者加入到所有這些事件中,然後它引發了另一個生產者完成時加入的事件。你仍然需要序列化對你的對​​象的實際訪問權限,雖然一個簡單的'lock(syncobj)'對於只有一個使用者就足夠了。 – Blindy