Synchronisation de la queue de messages entre les processus

J’essaie de mettre en œuvre un programme qui a un producteur et N (N> = 1) travailleurs. Ils communiquent en utilisant une queue de messages. L’idée est que le producteur envoie à la queue des “tâches”. Les travailleurs effectuent un appel msgrcv () pour obtenir une tâche et exécuter du code. Une fois que le travailleur a accompli la tâche, il envoie à la queue le résultat du calcul. Le producteur recevra ce message et enregistrera les résultats.

J’utilise les files d’attente de messages POSIX et le producteur et les travailleurs travaillent simultanément.

Le problème derrière ce programme est qu’il existe un scénario qui compromet la communication. Chaque message a une taille d’environ 5000 octets. La taille maximale de la queue est d’environ 16 000 octets dans UNIX Systems, ce qui est le cas.

Le scénario est le suivant: Il y a 3 tâches dans la queue (5000 * 3 = 15 000 octets). Certains travailleurs reçoivent un message de la queue (maintenant la queue contient 10000 octets). L’agent commence à exécuter la tâche et, en raison de la quantité d’octets qu’il doit traiter dans chaque tâche, le producteur envoie un autre message à la queue (la queue est maintenant pleine). Maintenant, une fois la tâche terminée, le technicien tente d’envoyer le résultat dans la queue et devient bloqué (la queue est saturée). Le producteur essaie d’envoyer une autre tâche à la queue et devient également bloqué.

Si je lance ce programme avec un seul employé, il est fort probable que ce scénario se produise.

Est-ce que quelqu’un a une idée pour éviter cette situation?

Si vous ne pouvez pas modifier la taille de la queue, le nombre de files d’attente à utiliser ou utiliser une API de queue différente, qu’en est-il de la mise en queue de moins de données?

Vous pouvez placer les données réelles dans des objects de mémoire partagée ou des fichiers temporaires. Ensuite, au lieu de mettre les données dans le message, vous placez un nom de fichier ou un nom d’object de mémoire partagée et éventuellement un décalage dans le message. Le processus de production peut ensuite le nettoyer après avoir reçu les résultats.

Il ne doit pas nécessairement s’agir de mémoire partagée ou de fichiers temporaires, mais l’idée est de placer les données ailleurs que dans le message et d’inclure dans le message toutes les informations nécessaires pour que l’autre processus puisse y accéder.

J’utiliserais une seconde queue de messages pour que le client -> réponses du serveur ou la limite (#sent – #received) soit un numéro sûr.