簡體   English   中英

在進程之間同步消息隊列

[英]Synchronizing message queue between processes

我正在嘗試實現一個具有生產者和N(N> = 1)工人的程序。 它們使用消息隊列進行通信。 這個想法是生產者向隊列發送“任務”。 工作人員執行msgrcv()調用以獲取任務並執行一些代碼。 在工作人員完成任務之后,它將計算結果發送到隊列。 制作人將收到此消息並保存結果。

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

該程序背后的問題是存在危及通信的場景。 每條消息的大小約為5000字節。 在UNIX系統中,最大隊列大小約為16000字節,在這種情況下。

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

如果我只用一個工作程序運行這個程序,那么這種情況很有可能發生。

有沒有人有想法避免這種情況?

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

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

它不一定必須是共享內存或臨時文件,但其目的是將數據放在消息之外的其他位置,並在消息中包含其他進程訪問它所需的任何信息。

我要么為客戶端使用第二個消息隊列 - >服務器響應或限制(#sent - #received)是一個安全號碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM