2011-11-20 92 views
3

我試圖實現一個有生產者和N(N> = 1)個工人的程序。他們使用消息隊列進行通信。 這個想法是生產者發送隊列「任務」。工作人員通過msgrcv()調用來獲取任務並執行一些代碼。在工作人員完成任務之後,它將計算結果發送到隊列。製片人會收到此訊息並保存結果。在進程之間同步消息隊列

我正在使用POSIX消息隊列,並且生產者和工作者同時工作。

這個程序背後的問題是存在一個危及通信的場景。 每條消息的大小約爲5000字節。在UNIX系統中,最大隊列大小爲〜16000字節。

該場景是:隊列中有3個任務(5000 * 3 = 15000字節)。某些工作人員從隊列中獲取一條消息(現在該隊列有10000個字節)。工作人員開始執行任務,並且由於工作人員必須在每個任務中處理的字節數量,生產者會向隊列發送另一條消息(隊列現在已滿)。 現在任務完成後,工作人員嘗試將結果發送到隊列並被阻塞(隊列已滿)。生產者試圖將另一個任務發送到隊列並被阻塞。

如果我只用一個工人運行這個程序,這種情況發生的可能性很大。

有沒有人有一個想法,以避免這種情況?

+0

我會考慮使用沒有這些限制的消息排隊機制,而不是使用某些看起來根本不適合您的用例的東西。 (除非你很難要求使用POSIX MQ)。也許ZeroMQ--我相信它可以作爲一個輕量級嵌入式庫。 – millimoose

+0

謝謝你的快速回答。是的,在這種情況下,我必須使用POSIX MQ。 –

+0

在一個程序或多個進程中使用多個線程嗎? – Dmitri

回答

1

如果您無法更改隊列大小,要使用的隊列數量或使用不同的排隊API,那麼排隊較少的數據又如何呢?

您可以將實際數據放在共享內存對象或臨時文件中。然後,而不是將數據放入消息中,而是將消息中的文件名或共享內存對象名稱以及可能的偏移量。生產者過程可以在收到結果後進行清理。

它不一定是共享內存或臨時文件,但是想法是將數據放在消息以外的地方,並在消息中包含任何其他進程訪問它所需的信息。

+0

嗨德米特里, 這就是我現在要做的。我會將數據放入共享內存中以排列較少的數據。處理文件與共享內存相比總是很慢。感謝所有幫助 –

0

我會爲客戶端 - >服務器響應或限制(#發送 - #接收)使用第二個消息隊列是一個安全的數字。

+0

感謝您的答案。我只能使用一個消息隊列。爲了限制(#sent - #received),我需要知道隊列中存在多少特定類型的消息(生產者 - >工作者或工作者 - >生產者),並且使用UNIX MQ,我無法知道這個消息。 –

+0

看不出爲什麼你不能跟蹤製片人的任務(發送的任務 - 收到的結果)。 – themel

+0

嗨themel, 我可以跟蹤(發送的任務 - 收到的結果)在生產者,但我現在會遵循德米特里的建議。 謝謝你的幫助:) –